如何将带点的批处理参数传递到powershell脚本中



我有一个批处理脚本,它将由不在我控制下的外部进程运行。外部进程可以为批处理脚本提供可变数量的参数。然后,我想将这些变量传递给powershell脚本。问题是,其中一些变量看起来像:

-Dfoo.bar=baz

出于某种原因,Powershell将其分解为两个arg。在命令行上,我可以在arg周围添加引号,并结束它。但我怎样才能让批次通过呢?这是我的脚本:

@echo off
SET CMD=C:Scriptsfoo.ps1
PowerShell.Exe -Command "%CMD%" %*

我注意到这个问题和这个问题非常相似。在这里,他正在逃离$角色。我试着对句点和/或短划线字符做一些类似的操作,但没有成功。有人有什么想法吗?

如果您从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

类似的东西可能会起作用:

@echo off
set "CMD=C:Scriptsfoo.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'

要以文字形式传递内容,可以用单引号将其括起来。我的建议是对你的论点这样做,然后在PowerShell中将它们分解一次,并将它们飞溅到你的命令中。

@echo off
SET CMD=C:Scriptsfoo.ps1
PowerShell.Exe -Command "%CMD%" '%*'

然后在Powershell中:

Param($PassedArgs)
$SplitArgs = $PassedArgs.trim("'").split(" ")
SomeCommand @SplitArgs

最新更新