Visual Studio后生成事件调用带有空格参数的批处理文件。

4

有人知道如何做到这一点吗?

我有一个 .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"

如何在构建后步骤中调用正确的语法?

我也遇到了设置它作为外部工具的类似问题,所以任何有关这两个方面的帮助都将不胜感激!


你引用的错误听起来像是批处理文件中特定命令未被执行。 - pilotcam
我认为批处理脚本没问题 - 我可以在命令行中运行它而没有问题。但是当我尝试在脚本名字前面加上$(SolutionDir)路径以及其他参数来运行它时,就会出现问题。在命令行中尝试时,我得到了类似的错误信息,所以肯定是引号的问题搞砸了一切。我只是找不到正确的组合方式! - Hoobajoob
在命令行中,我一直在尝试指定批处理脚本的完整路径和$(SolutionDir)的完整路径,并将这些内容用引号括起来,但即使在命令行中也无法正常工作。如果您不在与脚本相同的目录中,难道您不能只指定脚本的完整路径(用引号括起来)作为命令行中的第一个元素,然后跟随批处理脚本的参数(同样用引号括起来)吗? - Hoobajoob
好的,你关于脚本内容的说法是正确的。第一行代码检查了一个空参数,使用了这个语句:"%1"==""。但是,当第一个参数被引号包含时,这些引号会成为%1的一部分,所以我应该使用"%~1"==""。谢谢! - Hoobajoob
为什么不尝试将它们扩展到消息框中,或者用它们填充文本文件?这可能会让您更好地了解错误的位置。如果一切正常,为什么不使用变量作为中间“持有者”,然后调用变量,而不是让C++(或其他语言)在执行命令时扩展变量。 - James K
显示剩余4条评论
1个回答

9
感谢评论区的pilotcam和James K指导我正确方向,我在VS2010中尝试调用批处理脚本时遇到了一些互操作问题。
当从命令行调用时,我总是传递不需要引号的相对路径。但是,在从VS2010调用时,我会使用带引号的完整路径,这是基于VS扩展$(SolutionDir)和其他宏的。
当批处理脚本处理这些参数时,它没有考虑到引号字符可能作为参数的一部分存在。因此,它首先检查空参数,如下所示:
if "%1"=="" goto usage

当使用VS这样的方式调用时,第一行代码会导致程序崩溃:

"$(SolutionDir)myScript.bat" "$(SolutionDir)"

...if语句出现了问题,因为引号被包含在%1的值中。正确的解决方法是将%1中的引号剥离,这样既可以在没有引号包围参数的命令行使用时正常工作,也可以在有引号包围参数的VS2010中正常工作:

if "%~1"=="" goto usage

修复后,其余部分都可以正常工作。很可能是批处理脚本101,你可以看出我写Windows批处理脚本的频率有多高。


感谢去掉引号,这在我的情况下起作用了。我从以下代码中删除了括号: call "$(ProjectDir)PostBuild.bat" $(ConfigurationName) - HostMyBus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接