我们有一个批处理文件,可以调用我们基于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
它都不起作用。 如何才能使等号不被剥离或删除?
答案 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