我编写了一个脚本,它获取给定(源)目录的子目录,然后检查另一个(目标)目录中是否存在匹配的子目录。如果它存在于目标中,则它将子目录的内容复制到目标。这是我到目前为止所做的:
$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在其中有空格,否则整个过程非常有效。我还想在robocopy的参数列表中添加/ XD Application Data参数,但名称应用程序数据中的空格也会导致错误。
任何人都可以清楚我是如何允许我需要空格的地方而不是脚本中的空格吗?
谢谢!
乙
答案 0 :(得分:3)
看起来你应该只使用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"
答案 1 :(得分:2)
为什么要使用Start-Process?您可以直接从PowerShell调用robocopy:
robocopy.exe $src\$folder $dst\$folder /r:3 /w:5 /e /COPYALL /LOG+:D:\Temp\DataMigration\$log.log /zb /np /nc
答案 2 :(得分: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')
因此,数组的每个元素都是一个单独的参数,并且不会在arguments
robocopy.exe
参数中分成几部分
使用$(Join-Path -Path $dst -ChildPath $folder)
而不是"$dst\$folder"