在Powershell中调用批处理脚本时如何传递等号?

时间:2011-02-09 01:05:50

标签: powershell batch-file

我们有一个批处理文件,可以调用我们基于MSBuild的构建过程。语法:

build App Target [ Additional MSBuild Arguments ]

在内部,它是这样做的:

msbuild.exe %1.msbuild /t:%2 %3 %4 %5 %6 %7 %8 %9

这会导致对MSBuild的调用如下所示:

msbuild.exe App.msbuild /t:Target

当任何参数包含等号=时,Powershell会完全删除它。我的批处理脚本永远不会看到它。标准cmd.exe命令提示符不会发生这种情况。

例如,如果我打电话

build App Target "/p:Property=Value"

这是传递给MSBuild的内容:

msbuild.exe App.msmbuild /t:Target /p:Property Value

我期待这个:

msbuild.exe App.msbuild /t:Target "/p:Property=Value"

我尝试过Powershell转义字符,标准命令提示符转义字符,甚至是我编写的内容:

build App Target "/p:Property=Value"
build App Target '/p:Property=Value'
build App Target /p:Property^=Value
build App Target /p:Property`=Value
build App Target /p:Property==Value

它都不起作用。 如何才能使等号不被剥离或删除?

6 个答案:

答案 0 :(得分:20)

我之前见过这个,并找到了一种欺骗的方法。我希望我能解释一下特别是'='的情况,但我不能。在您的情况下,我非常确定如果您想将属性传递给msbuild,以下内容将起作用:

build App Target '"/p:Property=Value"' 

当回显时,会产生以下结果:

msbuild.exe App.msbuild /t:Target "/p:Property=Value"

答案 1 :(得分:2)

使用PowerShell 3,您可以使用 - %来停止正常解析powershell。

build --% App Target "/p:Property=Value"

答案 2 :(得分:0)

我不知道是否有更简单的答案(我认为不是)但您可以通过使用.Net的进程类来调用cmd.exe来解决问题。这是一个例子:

# use .NET Process class to run a batch file, passing it an argument that contains an equals sign. 
# This test script assumes the existence of a batch file "c:\temp\test.bat"
# that has this content:
#      echo %1
#      pause
$cmdLine =  $cmdLine =  '/c c:\temp\test.bat "x=1"'
$procStartInfo =  new-object System.Diagnostics.ProcessStartInfo("cmd", $cmdLine )
$proc = new-object System.Diagnostics.Process
$proc.StartInfo = $procStartInfo
$proc.Start();

答案 3 :(得分:0)

您是否尝试使用单引号强制进行字面解释?

或者:     cmd / c'msbuild.exe App.msbuild / t:目标“/ p:Property = Value”'

答案 4 :(得分:0)

对于Windows环境下的多个场景,似乎只有双引号的单引号可能是最好的。 来自MS的以下链接显示其等号的支持(或限制) http://support.microsoft.com/kb/35938 它特定于批处理文件,但它可能会影响许多其他MS shell产品。

答案 5 :(得分:0)

答案是%2变成"/p:property",而%3变成"value"

通过同时使用%2%3在批处理文件中进行这项工作,并在它们之间插入=符号:

msbuild.exe %1.msbuild /t:%2=%3 %4 %5 %6 %7 %8 %9

,并且不要在命令行调用中使用引号字符。使用:

build App Target /p:property=value

对于带有=号的其他arg,只需将它们配对。

对于运行youtube-dl的简单批处理文件,我也遇到了同样的问题,其中我传递的URL带有=登录。 解决为:

@echo off
REM YTDL audio only
echo %1=%2
youtube-dl -f bestaudio --extract-audio --audio-format mp3 --audio-quality 0 %1=%2