2014-07-25 347 views
3

我寫過一個腳本,它獲取給定(源)目錄的子目錄,然後檢查另一個(目標)目錄中是否存在匹配的子目錄。如果它存在於目標中,則它將子目錄的內容複製到目標中。這是我到目前爲止有:變量中的空格 - Powershell

$src = read-host "Enter Source Dir" 
$dst = read-host "Enter Destination Dir" 
$log = read-host "Enter Log File Name" 
foreach ($folder in Get-ChildItem -Path $src) 
{ 
if (-Not (Test-Path "$dst\$folder")) {} 
else {start-process robocopy.exe -ArgumentList "$src\$folder $dst\$folder /r:3 /w:5 /e /COPYALL /LOG+:D:\Temp\DataMigration\$log.log /zb /np /nc"} 
} 

整個事情的作品相當不錯,除非變量$ SRC或$ DST將在其內部的空間。我還想將/ XD應用程序數據參數添加到robocopy的參數列表中,但名稱應用程序數據中的空間也會導致錯誤。

任何人都可以清除我如何可以允許我需要它們的空間作爲空間而不是腳本中的空格嗎?

謝謝!

回答

2

看起來你應該只是包裝用doubleqoutes源和目標路徑,一旦你需要使用其他的人裏面的雙引號,你應該逃避他們(雙引號內)。有幾種方法可以做到這一點。其中之一是使用反色('):

start-process robocopy.exe -ArgumentList "`"$src\$folder`" `"$dst\$folder`" /r:3 /w:5 /e /COPYALL /LOG+:D:\Temp\DataMigration\$log.log /zb /np /nc" 
+0

爲robocopy工作過,包括/ XD標誌!感謝您的快速回復,非常感謝! – user3878432

2

爲什麼你使用啓動過程呢?您可以直接在PowerShell中調用ROBOCOPY:

robocopy.exe $src\$folder $dst\$folder /r:3 /w:5 /e /COPYALL /LOG+:D:\Temp\DataMigration\$log.log /zb /np /nc 
+0

我假設直接從powershell調用它會讓它暫停,直到複製操作完成,然後再轉到下一個 - 但從來沒有檢查過,因爲我在上面使用了其他一些「標準」腳本的腳本。我會承擔你未來的建議,但感謝Keith! – user3878432

2
-ArgumentList

正確的形式將類似於此陣:

Start-Process -Path 'robocopy.exe' -ArgumentList @(
      $(Join-Path -Path $src -ChildPath $folder), 
      $(Join-Path -Path $dst -ChildPath $folder), 
      '/r:3', 
      '/w:5', 
      '/e', 
      '/COPYALL', 
      '/LOG+:D:\Temp\DataMigration\$log.log', 
      '/zb', 
      '/np', 
      '/nc') 

所以陣列中的每個元素將是一個單獨的參數,而不會被分成部分在robocopy.exe

arguments參數,更preferrable使用$(Join-Path -Path $dst -ChildPath $folder) istead的"$dst\$folder"