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

Check Computer Object is Alive On Domain

Powershell'in gücü system admin rolündeki kişiler için tartışılmaz. Zaman zaman üzerinde aging tanımı olmayan ortamlarda, düzgün yönetilemeyen domain ve dns ortamlarında aslında kapalı olan ve kapalı olmamasına rağmen domainden düşmüş computer objelerinin tespit edilebilmesi için aşağıdaki gibi bir script geliştirmiştim. Umarım faydası olur, her türlü ek geliştirme için hakkiogretmen@gmail.com adresine mail atabilirsiniz. Import-Module ActiveDirectory $myServers = @("servers") If (Test-Path "D:\Temp\PasswordLastSetResult.txt"){ Remove-Item "D:\Temp\PasswordLastSetResult.txt" } $Servers_OU =  "OU=ServersOU,OU=ABCServersOU,DC=mydomain,DC=dmn,DC=com" foreach ($myserver in $myServers)         {         $mycomp = Get-ADComputer –SearchBase $Servers_OU –SearchScope SubTree -Filter { OperatingSystem -like "Windows Server*"} -Properties PasswordLastSet,IPv4Address | Select * | Where-Object {$_.Name -eq $myserver} trap [Syste...

Configure IIS Application pool to use gMSA

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 web application sunucusunda kullanıma alacağımızı aktarmaya çalışacağım. Web Application'ımız veritabanı bağlantısı kuracak ise SQL Server'da gMSA'i yetkilendirme yazımı inceleyebilirsiniz. Umarım faydalı olur. IIS Manager'ı (run-->inetmgr) açarak Application Pools listemizi açmalıyız. Application Pools Llist Değişiklik yapmak istediğimiz Application Pool seçilerek Advanced Settings ekranı açılır. Bu ekranda değiştireceğimiz alan Identity alanıdır. Advanced Settings --> Identity Application Pool'umuz gMSA kullanıcımız verilerek konfigüre edilir. Username kısmına domain\gMSA$ şeklinde gMSA eklenir. Password Active Directory tarafından yönetildiği için bu alanlar boş bırakılır. Configure Identity Credentials Uygulamamız içerisinde Windows Authentication kullanılmıyorsa connection string'imizi d...

Powershell Kullanarak Windows Features Yönetimi (Import And Export)

Bu yazı Windows Server 2008, Windows Server 2008 R2, Windows Server 2012, Windows Server 2012 R2 ve Windows Server 2016 işletim sistemleri üzerinde kullanılabilecek bilgiler içerir. Yazıyı okumaya başlamadan önce yazı içerisinde kullanılacak Get-WindowsFeature ve Add-WindowsFeature cmdletleriyle ilgili detaylı bilgileri inceleyebilirsiniz. Kendi ortamınızda test yapmadan önce ServerManager modülünü import etmelisiniz, Import-Module cmdlet için de yine MSDN üzerindeki bilgilerden faydalanabilirsiniz. Umarım faydalı bir yazı olmuştur. Birden fazla sunucuya benzer kurulumları yapmak istediğimizde karşımıza operasyonel zorluklar çıkabiliyor. Bu işlemleri hızlandırmanın & standart bir hale getirmenin bir çok yolu var ancak bu yazıda bir sunucu üzerinde kurulu Windows Feature'ların powershell ile toplanarak, diğer bir sunucuda kurulması için en basit olduğunu düşündüğüm yöntemi paylaşacağım. İlk olarak servermanager modülünün Powershell sessionımıza import edilmesi gerekmekted...