我编写了一个脚本,该脚本获取给定(源)目录的子目录,然后检查另一个(目标)目录中是否存在匹配的子目录。如果它存在于目标中,那么它将子目录in的内容复制到目标中。以下是目前为止的内容:
$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:TempDataMigration$log.log /zb /np /nc"}
}
除非变量$src或$dst里面有一个空格,否则整个事情运行得很好。我还想将/XD Application Data参数添加到robocopy的参数列表中,但是名称Application Data中的空格也会导致错误。
谁能澄清我如何允许空格,我需要他们作为空格,而不是在脚本中的休息?
谢谢!
B看起来你应该用双引号包装源路径和目标路径,一旦你需要在另一个路径中使用双引号,你应该转义它们(内双引号)。有几种方法可以做到这一点。其中之一是使用backtick ('):
start-process robocopy.exe -ArgumentList "`"$src$folder`" `"$dst$folder`" /r:3 /w:5 /e /COPYALL /LOG+:D:TempDataMigration$log.log /zb /np /nc"
为什么要使用Start-Process ?你可以直接从PowerShell调用robocopy:
robocopy.exe $src$folder $dst$folder /r:3 /w:5 /e /COPYALL /LOG+:D:TempDataMigration$log.log /zb /np /nc
-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:TempDataMigration$log.log',
'/zb',
'/np',
'/nc')
所以数组的每一个元素都是一个单独的参数,不会在robocopy.exe
的arguments
参数中被分成几个部分
用$(Join-Path -Path $dst -ChildPath $folder)
代替"$dst$folder"
更有利