我有一个批处理脚本,它将由不受我控制的外部进程运行。外部进程可以为批处理脚本提供可变数量的参数。然后我想将这些变量传递给powershell脚本。问题是,这些变量中的一些看起来像是:
-Dfoo.bar =巴兹
Powershell出于某种原因将其分为两个方面。在命令行中,我可以在arg周围添加引号并将其称为一天。但是我如何通过这种方式获得批量传递呢?这是我的剧本:
@echo off
SET CMD=C:\Scripts\foo.ps1
PowerShell.Exe -Command "%CMD%" %*
我注意到这个问题与this one非常相似。在这里,他逃脱了这个角色。我尝试为点和/或短划线字符做类似的事情,但没有运气。有人有什么想法吗?
答案 0 :(得分:4)
如果你从CMD调用你的脚本,它可以正常工作:
C:\>.\foo.bat -Dfoo.bar=baz
args are -Dfoo.bar=baz
要解决从PowerShell运行批处理脚本时出现的问题,请使用stop parsing operator --%
例如:
C:\ PS> .\foo.bat --% -Dfoo.bar=baz
args are -Dfoo.bar=baz
答案 1 :(得分:1)
要以文字形式传递内容,您可以将它们用单引号括起来。我的建议是为你的参数做这个,然后在PowerShell中将它们分解一次,然后将它们发送给你的命令。
@echo off
SET CMD=C:\Scripts\foo.ps1
PowerShell.Exe -Command "%CMD%" '%*'
然后在Powershell:
Param($PassedArgs)
$SplitArgs = $PassedArgs.trim("'").split(" ")
SomeCommand @SplitArgs
答案 2 :(得分:1)
这样的事可能有用:
@echo off
set "CMD=C:\Scripts\foo.ps1"
set "ARGS=%*"
set "ARGS=%ARGS: =' '%"
PowerShell.Exe -Command "%CMD%" '%ARGS%'
演示:
C:\>type test.cmd
@echo off
set "CMD=C:\test.ps1"
set "args=%*"
set "args=%args: =' '%"
powershell -Command "%CMD%" '%args%'
C:\>type test.ps1
$args | % { $_ }
C:\>test.cmd -Dfoo.bar=baz -something
-Dfoo.bar=baz
-something
参数周围的单引号阻止PowerShell使用该参数执行时髦的事情。通过用' '
替换参数列表中的空格,可以在一个参数之后和下一个参数之前放置单引号。 "外部"变量周围的单引号在第一个参数之前和之后添加缺少的引号。
C:\>type test2.cmd
@echo off
set "args=%*"
echo %args%
set "args=%args: =' '%"
echo %args%
echo '%args%'
C:\>test2.cmd -Dfoo.bar=baz -something
-Dfoo.bar=baz -something
-Dfoo.bar=baz' '-something
'-Dfoo.bar=baz' '-something'