如何从PowerShell向命令行指令传递开关参数?
解决PowerShell调用ROBOCOPY时多开关参数的传递问题
问题根源在于:当你把包含空格的字符串"/XO /COMPRESS"作为单个参数传给ROBOCOPY时,PowerShell会将整个字符串包裹在双引号中,作为单个独立参数传递给ROBOCOPY。但ROBOCOPY需要的是两个分开的参数(/XO和/COMPRESS),因此会触发"无效参数"的错误。
你完全不需要显式声明ROBOCOPY支持的所有参数,以下几种方法可以优雅解决这个问题:
方法1:用数组传递开关参数
将多个开关存储在数组中,PowerShell会自动将数组的每个元素拆分为独立参数传递给ROBOCOPY:
function MyCopy($src, $dst, $files, $switches) { $res = ROBOCOPY $src $dst $files $switches Write-Host $res return $res } $src = "C:\" $dst = $Env:TEMP $files = "*.txt" # 用数组存储多个开关 $switches = @("/XO", "/COMPRESS") $res = MyCopy $src $dst $files $switches
方法2:拆分字符串并使用参数展开运算符
如果你的开关是从带空格的字符串来的,可以先拆分字符串为数组,再用@运算符展开传递:
function MyCopy($src, $dst, $files, $switches) { $res = ROBOCOPY $src $dst $files $switches Write-Host $res return $res } $src = "C:\" $dst = $Env:TEMP $files = "*.txt" $switchesStr = "/XO /COMPRESS" # 拆分字符串为数组 $switches = $switchesStr -split "\s+" # 使用@展开数组(也可以直接传$switches,这里是显式写法) $res = MyCopy $src $dst $files @switches
方法3:用剩余参数接收任意开关
通过ValueFromRemainingArguments属性,让函数自动接收所有额外传入的开关参数,调用时直接逐个传入开关即可:
function MyCopy { param( [string]$src, [string]$dst, [string]$files, [Parameter(ValueFromRemainingArguments)] [string[]]$switches ) $res = ROBOCOPY $src $dst $files $switches Write-Host $res return $res } $src = "C:\" $dst = $Env:TEMP $files = "*.txt" # 调用时直接将开关作为多个参数传入 $res = MyCopy $src $dst $files /XO /COMPRESS
以上方法都不需要提前定义ROBOCOPY的所有参数,能灵活处理任意数量的开关选项。
内容的提问来源于stack exchange,提问作者oscar
相关产品推荐
相关产品推荐

