2016-09-22 88 views
0

我有一个.bat文件,其中包含一系列指令,但是在某些时刻指令不再运行。这是最新的运行命令的一部分:窗口批处理.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 

我不明白为什么最后的回声没有打印,但所有的命令与&工程。

+1

'gem'是一个批处理文件,对不对? – aschipfl

回答

0

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

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

call gem update 

对于最佳结果,以确保没有泄漏的状态离开你们正在调用批处理文件,在一个子进程运行:

cmd /c gem update 

(这是相当UNFO rtunate,国际海事组织,gem是批处理文件,而不是一个正确的可执行文件。)

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 
+2

您不需要在ECHO语句前打一个CALL。 – Squashman

+0

您有正确的解决方案,但解释错误。当你从一个批处理文件运行一个普通的可执行文件时,命令解释器会创建一个子进程来运行它,并像你期望的那样运行;在这种情况下,不需要“呼叫”。在运行另一个批处理文件时需要'调用'的原因恰恰是,在这种情况下*有*没有子进程。命令解释器自己运行批处理文件,而不将作业传递给子进程。默认情况下,它不会返回到原始的批处理文件(出于历史原因),您需要'call'来告诉它这样做。 –

1

貌似是执行回声之前,命令正在退出。 尝试在脚本中的每个命令前使用CALL命令。

+0

更多信息http://ss64.com/nt/exit.html – soundslikeodd

相关问题