我在VS2010中运行批处理文件作为外部工具(通过在Tools->外部工具中添加)(我已选中“使用输出窗口”选项)。此批处理文件执行VS命令提示符中的编译。我正在处理的项目有各种文件夹的makefile,所以我使用mk命令来构建。 在批处理文件中,我设置了VS环境,然后运行以下命令:
cd $directoryWhichContainsFileToBuild
mk
cd main //This directory contains the executable that is to be built
mk
我在“输出”窗口中看到第一个mk的输出,但之后它只是挂起。我也尝试在第一个mk之后使用一个echo,但是即使那个也没有在输出窗口中打印出来(之前可以看到它)。 某处我读到VS 2010输出窗口出现问题,显示输出后它会挂起,虽然我不能确定这就是问题所在。
我是否需要启用其他一些VS设置?还有其他人遇到过这个问题吗? 感谢。
更新:我取消选中“使用输出窗口”和“退出时关闭”选项,我看到一个额外的声明:“按任意键继续”。但是,在执行此操作时,他们无需进一步处理批处理文件。
Update2 :通过为mk添加“call”前缀来实现它。 谢谢所有尝试过的人。
答案 0 :(得分:0)
批处理文件总是很好地指定具有完整路径和文件扩展名的可执行文件,而不仅仅是文件名。这避免了很多问题。
此处仅使用mk
代替mk.bat
。因此,在每次编译时,命令行处理器 cmd.exe 都会搜索 mk。* ,然后检查是否有任何找到的文件在环境变量 PATHEXT中列出了扩展名即可。由 PATHEXT 中的分号分隔的文件扩展名的顺序定义了目录包含多个 mk。* 文件时的执行顺序。
如果批处理文件中指定的命令不是没有路径的 cmd.exe 的内部命令,则命令行处理器首先搜索当前工作目录中具有给定名称的文件。这通常是导致错误的另一个原因。执行批处理文件的当前工作目录是什么?
接下来如果在当前工作目录中找不到要执行的文件,命令行处理器将搜索以分号分隔的环境变量 PATH 中列出的所有文件夹。
因此,在批处理文件中指定很少编辑外部应用程序或具有完整路径,文件名和文件扩展名的其他批处理文件,如果有必要,可以使用双引号,因为路径或文件名中有1个或多个空格,有助于命令行处理器更快地执行该应用程序或批处理文件,并避免因未找到可执行文件而导致的问题(未知命令)。
当然,在命令提示符窗口中键入命令时,没有人想要输入具有完整路径,名称和扩展名的可执行文件。但是对于批处理文件,不要使用延迟文件并输入要使用完整路径和扩展名执行的文件总是好的。
TripeHound已经解释了为什么观察到的行为发生在这里。
如果在不使用命令调用的情况下从另一个批处理文件执行批处理文件,命令行处理器将继续在另一个批处理文件中执行批处理,并且永远不会返回。在C / C ++程序中,这就像使用goto
一样,区别在于可以将参数传递给包含下一步要执行的其他命令的批处理文件。
但是在批处理文件中运行另一个带有调用的批处理文件会导致在另一个批处理文件到达结束时调用另一个批处理文件的行继续执行,但命令退出< / strong>用于没有参数/B
的被调用批处理文件。
所以这里的解决方案是使用:
cd /D "Directory\Which\Contains\File\To\Build"
call "Path\Containing\Batch\File\To\Build\mk.bat"
rem With mk.bat not changing current working directory change working
rem directory to the directory containing the executable to be built.
cd main
call "Path\Containing\Batch\File\To\Build\mk.bat"
BTW:退出退出命令处理器,退出/ B 退出当前批处理文件。我会给你三个猜测,为什么参数 B 而不是一个不同的字母。是的, B 是批次的第一个字母。
答案 1 :(得分:0)
作为一个单独的答案而不是问题本身的更新,因为许多读者看到标题并略过答案:通过在mk前加上“call”来使其工作。 (@TripleHound还在上面的评论中发布了它的概念性原因。)