Windows批处理.bat在所有命令执行前退出

时间:2016-09-22 23:59:29

标签: windows batch-file

我的.bat文件是一系列指令,但在某些时候指令不再运行。这是最新运行命令的一部分:

gem update --system
gem install --no-ri --no-rdoc bundle
gem install --no-ri --no-rdoc bundler
bundle install
echo EVERYTHING OK
echo Configuring DB

第一个命令显示这个,然后程序退出:

Latest version currently installed. Aborting.

所以我尝试在一个命令中运行所有这些命令:

gem update --system & gem .....  & bundle install & echo THIS IS PRINTED OK
echo THIS IS NOT PRINTED

我无法理解为什么最后的回声没有被打印出来,但&的所有命令都有效。

3 个答案:

答案 0 :(得分:1)

每次在批处理文件中执行命令时,它都会将执行流程的控制权传递给子进程。

为避免这种情况,我们需要在每个命令之前加CALL前缀:

call gem update --system
call gem install --no-ri --no-rdoc bundle
call gem install --no-ri --no-rdoc bundler
call bundle install

echo EVERYTHING OK
echo Configuring DB

答案 1 :(得分:1)

在执行echo之前看起来命令正在退出。 尝试在脚本中的每个命令前面使用CALL命令。

答案 2 :(得分:0)

当批处理文件包含另一个批处理文件的命令时,批处理器将其解释为用指定的批处理文件替换当前批处理文件的指令。这种行为来自MS-DOS的黑暗时代,但是为了向后兼容而保留了这些行为。 (这可能也是批处理器仍然存在的唯一原因!)

如果要运行其他批处理文件然后继续,则必须使用call命令,例如,

call gem update

对于最佳结果,要确保没有状态从您正在调用的批处理文件中泄漏,请在子进程中运行它:

cmd /c gem update

(相当不幸的是,IMO,gem是批处理文件而不是正确的可执行文件。)