Ana içeriğe atla

Copy Files and Folders with structure

Herkese Merhaba,

Robocopy yıllarca dosya operasyonlarında kadim dostumuz oldu, ancak kabul etmeliyiz ki artık devir Powershell'in devri..

Aslında bazı arkadaşlar bu kadar uğraşmaya ne gerek vardı, Copy-Item ile bu işlemi yapabilirsin der gibi ancak, ben yaptığım testlerde Copy-Item'in -Exclude parametresinin sağlıklı çalışmadığını gözlemledim. Bu nedenle de kontrolün tamamen bende olacağı, biraz eski kafalıyım kabul, item item gezerek kontrol sağlayan aşağıdaki scripti geliştirdim.

Scriptin özellikle ilk bölümündeki CmdletBinding() bölümü bir kısmınız için tanıdık olmayabilir. Onunla ilgili olarak blogda Power of Powershell yazısını incelemenizi tavsiye ederim. 

Function aslında basit bir iş yapıyor ancak benim gibi detaycı:) Tıpkı Copy-Item gibi iki parametreye ihtiyacımız bulunuyor. $sourceDirectory ile kopyalama yapacağımız folder bilgisini iletmeliyiz. Örneğin C:\inetpub\wwwroot\site1 sitesinin içeriğini bir yere kopyalamak istiyorsak, doğrudan bu şekilde parametre değerini iletmeliyiz. $destinationDirectory ise kopyalamayı yapacağımız directoryi istiyor. Örneğin bu değer de E:\CustomSitePath\site1 olmalıdır.

Config dosyalarını hedef path'te ezmemek için kopyalamıyoruz ancak unutmamız gerekiyor ki, eğer hedef pathin leaf folderi yeni create olacaksa, içerisinde henüz hiç bir config dosyası olmayacaktır. Bu durumda exclude listemizi de dinamik olarak değiştirebilmeliyiz. Aslında bu işlemi yapan DSC scripti de yazmıştım ancak henüz blog yazısına çeviremedim. Bu operasyonun Test-Path bölümünü DSC ile yapmak modaya daha uygun olabilirdi ancak mevcut functionı bozmadan basit haliyle paylaşmak istedim. 

Umarım işinize yarar. Sorularınız ya da geri bildirimleriniz için hakkiogretmen@gmail.com mail adresimden ulaşabilirsiniz.. Powershell ile kalın:) 



function copyToRemoteDirectory{
[CmdletBinding(SupportsShouldProcess)]
param(
$sourceDirectory,
$destinationDirectory
)
$Error.Clear()


if(-not (Test-Path -Path $destinationDirectory))
{
Write-Verbose "Creating $destinationDirectory"
md -Path $destinationDirectory
$excludeList = ""
}
Else
{
$excludeList = "*.config"
}

$sourceItems = Get-ChildItem -Path $sourceDirectory -Exclude $excludeList  -Recurse -Verbose

foreach($item in $sourceItems)
{
$splitPathItem = $null
$MychildItem = $null
$myDestItem = $null

$splitPathItem = Split-Path $item.FullName -Parent -Verbose
$MychildItem =  $splitPathItem -ireplace [regex]::Escape($sourceDirectory), $null
$myDestItem = Join-Path $destinationDirectory -ChildPath $MychildItem -Verbose
Copy-Item  $item.FullName -Destination $myDestItem  -Force -Verbose -ea Continue
}

if($Error.Count -gt 0)
{
Write-Warning ("Error occured while copying to remote site. [ERROR_Code:130]:" -f $Error)
return 130
}
}


#örnek olarak aşağıdaki gibi scripti çalıştırarak sonuçları gözlemleyebilirsiniz...
copyToRemoteDirectory  -sourceDirectory "C:\inetpub\wwwroot\vd2Main" -destinationDirectory "C:\WebSites\vd2Main" -Verbose


Yorumlar

Bu blogdaki popüler yayınlar

gMSA (group managed service account) and SQL Server

MSA (managed user account) teknolojisinin sorunlarından bir tanesi aynı MSA'i birden fazla computer objesinde kullanamamaktı. Bu nedenle de gMSA (group managed service account) duyuruldu. gMSA ile; Passwordler Active Directory tarafından yönetileceği için complex olurlar ve sık sık otomatik olarak değiştirilir (default 30 days). Passwordler 240 bytes uzunluğunda randomly şifrelenmiş olarak üretilir. Ek olarak interactive logon amaçlı kullanılamazlar, yanlış şifre girilmesi sonucunda meydana gelen lock-out olma durumuna yakalnmazlar. Şifre değişikliği sonrasında SQL Server Servisinin restart edilmesine gerek bulunmaz. Aşağıda belirtilen adımlar pre-reqlerin tamamlanmış olduğu varsayılarak step by step aktarılmıştır. Prerequisetlerle ilgili detaylı bilgilendirmeye  https://technet.microsoft.com/en-us/library/jj128431.aspx#BKMK_gMSA_Req  linkinden erişilebilir. 1-  Active Directory Users and Computers Altında Global Security Group Oluşturma gMSA 'i kullanacağımız sun

Fun with Docker..ELK Stack-Kibana

Hatırlarsanız Fun with Docker yazı serisine ELK Stack kurulumunu aktaracak bir yazı serisiyle devam etmeye karar vermiştik. Dün yazının ilk ve olmazsa olmaz parçası olan ElasticSearch kurulumunu tamamlamıştık. Bugün ise Kibana kurulumuyla devam edeceğiz. Kibana ELK Stack yapısının görsel arayüzünü sunan projedir. Önceki yazıda da yazdığım gibi ELK Stack ile ilgili tüm detaylara  https://www.elastic.co/elk-stack  linkini kullanarak ulaşabilirsiniz.  Bugünkü yazımızda Kibana imajını çalıştırırken ElasticSearch için kullandığımız ip ve hostname bilgilerini kullanacağız. Bu çalışma sırasında iki farklı container imajından myKibana ismini vereceğimiz Kibana imajı, Elastic imajına network üzerinden erişerek, görüntüleme ve raporlama arayüzünü sunacak. Kısaca daha önce Elastic için kullandığımız bilgileri hatırlarsak; Elastic imaj hostname: myElastic Elastic imaj ip: 172.18.0.21 Kibana konfigürasyon sırasında kibana.yml dosyasını kullanıyor, bu dosyada yazan elasticsearch

Configure gMSA as login on SQL Server Instance

Daha önce yayınladığım  gMSA oluşturma  yazımda Active Directory'de nasıl gMSA oluşturacağımı paylaşmıştım. Bu yazıda ise bu gMSA 'i nasıl SQL Server database'inde oluşturup, yetkilendireceğimizi aktarmaya çalışacağım. Umarım faydalı olur. test domaininde create edilmiş testIISAppPool1 isimli gMSA 'i SQL Server'da login olarak tanımlayacağım. SQL Server sunucumuzu gMSA için daha önce oluşturduğumuz security group üyeleri arasında eklediğimizden ve bu işlemi yaptıktan sonra policy refresh için suncuyu restart etmiş olduğumuzdan emin olmalıyız.  Ek olarak gMSA 'i yazdıktan sonra sonuna $ eklememiz gerektiğini de unutmamalıyız.  Configure gMSA on Sql Server