2014-07-25 108 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"