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"

从构建后步骤调用它的正确语法是什么?

我在将其设置为外部工具时也遇到了类似的问题,因此非常感谢您提供任何帮助!

4

1 回答 1

9

感谢 Pilotcam 和 James K 在评论中为我指明了正确的方向,我遇到的互操作问题在我试图从 VS2010 调用的批处理脚本中是一个相对简单的问题。

从命令行调用时,我总是传入不需要引号的相对路径。当从 VS2010 调用时,我根据 VS 对 $(SolutionDir) 和其他带有引号的宏的扩展来指定完整路径。

当批处理脚本处理这些参数时,它并没有考虑到引号字符可能作为参数的一部分出现的事实。所以,它做的第一件事就是检查这样的空参数:

if "%1"=="" goto usage

第一行是从 VS 调用时令人窒息的内容,如下所示:

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

... if 语句被阻塞,因为封闭的引号被煮成了 %1 的值。正确的修复方法,当参数周围没有封闭引号时以及 VS2010 时都适用于命令行使用,就像这样从 %1 中去除引号:

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

...在解决这个问题后,其余的工作就很好了。可能是批处理脚本 101,因此您可以知道我编写 Windows 批处理脚本的频率。

于 2012-10-07T01:55:16.053 回答