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
}
}
copyToRemoteDirectory -sourceDirectory
"C:\inetpub\wwwroot\vd2Main" -destinationDirectory "C:\WebSites\vd2Main"
-Verbose
Yorumlar
Yorum Gönder