2014-10-28 130 views
4

我有一个批处理脚本,将由一个不受我控制的外部进程运行。外部进程可以为批处理脚本提供可变数量的参数。然后我想将这些变量传递给一个powershell脚本。问题是,是,一些变量的样子:如何将包含点的批处理参数传递到PowerShell脚本中?

-Dfoo.bar =巴兹

PowerShell的出于某种原因打破它变成有两个参数。在命令行上,我可以在arg周围添加引号并将其称为一天。但是,我将如何批量通过这种方式呢?这里是我的脚本:

@echo off 
SET CMD=C:\Scripts\foo.ps1 

PowerShell.Exe -Command "%CMD%" %* 

我注意到这个问题是非常相似的this one。在这里他逃避了$角色。我试着做点和/或破折号字符类似的东西,但没有运气。任何人有任何想法?

+0

我在mvn命令中遇到了同样的问题:'mvn ... -DgroupId = xy ...'并且它产生了一个奇怪的错误*未知生命周期阶段“.y”*。那是我决定使用cmd的那一刻...... – 2015-12-29 15:34:20

回答

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'
+0

这就是我要使用的,尽管如果其中一个参数有一个空格,我认为它不会起作用。 :( – 2014-10-29 13:51:45

+0

问题是,CMD将'=',','和';'视为[分隔符](http://ss64.com/nt/syntax-esc.html),就像空格一样,所以没有简单和完整的处理方式,你需要一个全面的解析器来处理所有的案例 – 2014-10-29 19:16:01

1

要将事情作为文字传递,可以将它们用单引号括起来。我的建议是为你的论点做这件事,然后在PowerShell中将它们分解一次,并将它们溅到你的命令中。

@echo off 
SET CMD=C:\Scripts\foo.ps1 

PowerShell.Exe -Command "%CMD%" '%*' 
在PowerShell中

然后:

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

如果你打电话从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

哪个PowerShell版本?我有OP描述PowerShell v3的确切行为,从CMD运行批处理脚本。 – 2014-10-29 08:10:02

+0

对Powershell 2.0进行编程,因为我认为让我的队友从他们的默认值升级会有点多,就像@AnsgarWiechers所说的,即使是从cmd运行它也会出现这种行为,另外,不幸的是, - %技巧不起作用。:(听起来像是微软因为遇到这个问题而添加的东西。 – 2014-10-29 13:50:38

+0

@AnsgarWiechers我在Win 8.1上运行v4。 – 2014-10-29 15:25:13

相关问题