2016-09-22 30 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

相關問題