![讓命令提示字元啟動記事本等應用程式並阻止直至其關閉](https://rvso.com/image/1449111/%E8%AE%93%E5%91%BD%E4%BB%A4%E6%8F%90%E7%A4%BA%E5%AD%97%E5%85%83%E5%95%9F%E5%8B%95%E8%A8%98%E4%BA%8B%E6%9C%AC%E7%AD%89%E6%87%89%E7%94%A8%E7%A8%8B%E5%BC%8F%E4%B8%A6%E9%98%BB%E6%AD%A2%E7%9B%B4%E8%87%B3%E5%85%B6%E9%97%9C%E9%96%89.png)
我有一個批次腳本,我本質上希望它向用戶展示一個記事本窗口,其中打開一個配置文件,供用戶每次運行該腳本時進行編輯,並且我希望命令提示符等到該程序關閉後再繼續執行,並運行使用該設定檔的程式。
我想這樣做是因為我不想使用“set /P”命令樣式在批次腳本中獲取使用者輸入,並且必須設定解析讀取和寫入具有許多要檢查的值的設定檔。
我相信 Windows 上執行任何可執行程序時的標準行為是,對於“exe”文件,它將在自己的進程中打開該程序,並立即將控制權返回到腳本/命令提示符。對於「bat」和「cmd」腳本文件,它將執行腳本並等待,直到控制權傳回第一個腳本或命令提示字元。這應該是至少使用“CALL”命令呼叫其他腳本或直接呼叫它時的行為。
現在在 Linux 上,我相信可執行內容的預設行為是沒有副檔名的本機機器碼和「sh」檔案等腳本,以阻塞方式執行,除非您指定與符號(「&」)字元輸入行上的某處。
因此,我試圖在 Windows 上實現阻止行為,因為它在 Linux 上更容易完成,並且希望關閉程式以觸發原始腳本繼續,或將控制權返回到命令提示字元。
答案1
你可以使用start
命令(注意開關順序/B /WAIT
)
start "" /B /WAIT notepad.exe "somefile"
或簡單地
notepad.exe "somefile"
根據上面的連結:
當您執行 32 位元圖形使用者介面 (
GUI
) 應用程式時,cmd
不等待應用程式退出就返回命令提示字元。如果您從命令腳本運行應用程序,則不會發生此行為。
編輯關於卡蘭的評論:為什麼需要/B?
/B
啟動應用程式而不開啟新的命令提示字元視窗。
- 說實話:如果你運行一個圖形使用者介面應用程式然後不即使省略開關,也會開啟新的命令提示字元視窗
/B
。 - 另一方面,如果您運行命令列工具,省略
/B
開關會導致在新的命令提示字元視窗中執行該工具將立即關閉當它結束後它的所有輸出都遺失了。
因此,我將這些/B /WAIT
開關一起使用作為一般原則:無論啟動程序的配置如何,都保持相同的行為,並且無需考慮它...
補充按/B /WAIT
開關順序包含來自 StackOverflow 的範例和更多鏈接:在工作時start /WAIT /B
不起作用(/wait
參數被忽略) ...start /B /WAIT
答案2
notepad.exe | echo > NUL
它的作用是,它打開 notepad.exe 並將其所有輸出重新導向到命令echo > NUL
。為了重定向整個輸出,程式必須完成。因此我們必須等到notepad.exe完成。輸出變為迴聲。 Echo 不以任何方式使用輸入,只是將一些內容輸出到 NUL。 NUL 是一個標準的 Windows 串流,無處可去。
答案3
在寫問題的時候,我想到了一個答案,儘管它沒有達到我想要的確切結果。
這將是打開我想打開的任何程序,並在下面一行的該程序之後直接添加“暫停”命令。它會暫停腳本執行,直到用戶關閉剛剛出現的新程式窗口,並且需要意識到他們需要從該點手動推進腳本。暫停會列印一條提示,解釋正在發生的情況,以潛在地通知使用者(「Press any key to continue . . .
」)。
這不是一個主要問題,除非腳本由於某種原因被最小化,並且用戶認為它已經完成。它也不是很好,因為當程式關閉時它不會自動恢復運行腳本的其餘部分,這正是我想要的效果。
答案4
以下是啟動 Firefox 時對我有用的內容:
start "" /B /WAIT "G:\Programs\Mozilla Firefox\firefox.exe" | pause