变量中的空格- Powershell



我编写了一个脚本,该脚本获取给定(源)目录的子目录,然后检查另一个(目标)目录中是否存在匹配的子目录。如果它存在于目标中,那么它将子目录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.exearguments参数中被分成几个部分

$(Join-Path -Path $dst -ChildPath $folder)代替"$dst$folder"更有利

相关内容

  • 没有找到相关文章

最新更新