Visual Studio Post-Build 事件调用带有空格的参数的批处理文件
Posted
技术标签:
【中文标题】Visual Studio Post-Build 事件调用带有空格的参数的批处理文件【英文标题】:Visual Studio Post-Build events calling batch files with arguments that have spaces 【发布时间】:2012-09-27 16:58:48 【问题描述】:有人知道怎么做吗?
我有一个 .bat 脚本,我希望它既可以在命令行中使用,也可以在 Visual Studio 中使用。
脚本接受参数,其中一些可以包含空格。
.bat 脚本的路径可以包含空格,最好表示为相对于 $(SolutionDir) 的路径。
我已经尝试了一百种不同的命令行变体,其中包含不同的引号和转义字符组合,包括:
"$(SolutionDir)myScript.bat" "$(SolutionDir)\" "$(Platform)" "$(Configuration)"
call "$(SolutionDir)myScript.bat" "$(SolutionDir)" "$(Platform)" "$(Configuration)"
cmd /c ""$(SolutionDir)myScript.bat" "$(SolutionDir)" "$(Platform)" "$(Configuration)""
但它们都会产生错误,我找不到有效的组合,而是通常会收到此错误:
"[path-to-script] is not recognized as an internal
or external command, operable program or batch file"
从构建后步骤调用它的正确语法是什么?
我在将其设置为外部工具时也遇到了类似的问题,因此非常感谢您提供任何帮助!
【问题讨论】:
您引用的错误听起来像是批处理文件中未执行的特定命令。 我认为批处理脚本很好 - 我可以从命令行运行它而不会出现问题。当我尝试通过在脚本名称前面加上 $(SolutionDir) 路径以及其他参数来运行它时,我遇到了这个问题。在命令行上尝试它,我得到了类似的错误,所以它一定是用引号引起的,这一切都搞砸了。我就是找不到合适的组合! 您是否从与 Visual Studio 使用的工作目录相同的工作目录运行批处理文件?您可以对批处理文件使用“cd”命令来查看它从哪个目录运行,然后尝试从命令行复制。和/或添加类似“echo %0 x %1 x %2 x %3”的内容来诊断 VS 是如何调用它的。 在命令行上,我一直在尝试指定批处理脚本的完整路径,以及 $(SolutionDir) 的完整路径,将内容括在引号中,即使从命令行。如果您与脚本不在同一目录中,您不能只指定脚本的完整路径,用引号括起来,作为命令行上的第一个元素,然后是批处理脚本的参数也包含在引号? 在命令行上,我使用的是:"感谢 cmets 中的 Pilotcam 和 James K 为我指明了正确的方向,我遇到的互操作问题在我尝试从 VS2010 调用的批处理脚本中是一个相对简单的问题。
当从命令行调用时,我总是传入不需要引号的相对路径。从 VS2010 调用时,我根据 VS 对 $(SolutionDir) 和其他带有引号的宏的扩展来指定完整路径。
当批处理脚本处理这些参数时,它并没有考虑到引号字符可能作为参数的一部分出现的事实。所以,它做的第一件事就是检查这样的空参数:
if "%1"=="" goto usage
当像这样从 VS 调用时,第一行是令人窒息的:
"$(SolutionDir)myScript.bat" "$(SolutionDir)"
...if 语句阻塞,因为括起来的引号已经变成了 %1 的值。正确的修复方法是在参数周围没有封闭引号时以及从 VS2010 中使用时都适用于命令行使用,就像这样:
if "%~1"=="" goto usage
...修复此问题后,其余部分工作正常。可能是批处理脚本 101,所以你可以知道我写 windows 批处理脚本的频率。
【讨论】:
感谢在我的情况下去掉引号我从 --> call "$(ProjectDir)PostBuild.bat" $(ConfigurationName) 中删除了封闭引号以上是关于Visual Studio Post-Build 事件调用带有空格的参数的批处理文件的主要内容,如果未能解决你的问题,请参考以下文章
Post-build Actions 部分看不到注入的环境变量