假設Windows有沒有一種方法可以在批處理文件中檢測到它是從打開的命令提示符還是通過雙擊啓動?我想在批處理過程結束時添加一個暫停,當且僅當它被雙擊時,這個窗口不會隨着它可能產生的任何有用輸出而消失。檢測批處理文件的執行方式
任何聰明的方法來做到這一點?我正在尋找可以依靠的解決方案,以便在使用默認設置配置更多或更少的計算機上工作。
假設Windows有沒有一種方法可以在批處理文件中檢測到它是從打開的命令提示符還是通過雙擊啓動?我想在批處理過程結束時添加一個暫停,當且僅當它被雙擊時,這個窗口不會隨着它可能產生的任何有用輸出而消失。檢測批處理文件的執行方式
任何聰明的方法來做到這一點?我正在尋找可以依靠的解決方案,以便在使用默認設置配置更多或更少的計算機上工作。
我剛跑過一個快速測試並注意到以下內容,這可以幫助你:
如果從命令控制檯運行此腳本不會暫停,但在資源管理器中會如果雙擊:
@echo off
setlocal enableextensions
set SCRIPT=%0
set DQUOTE="
@echo do something...
@echo %SCRIPT:~0,1% | findstr /l %DQUOTE% > NUL
if %ERRORLEVEL% EQU 0 set PAUSE_ON_CLOSE=1
:EXIT
if defined PAUSE_ON_CLOSE pause
編輯: 有從資源管理器中運行時,我可以還有些怪異的行爲沒有解釋。原來,而非
@echo %SCRIPT:~0,1% | findstr /l %DQUOTE% > NUL
if %ERRORLEVEL% EQU 0 set PAUSE_ON_CLOSE=1
我嘗試使用只是一個if
:
if %SCRIPT:0,1% == ^" set PAUSE_ON_CLOSE=1
從打開命令提示符下運行時,這會工作,但是從資源管理器中運行時會抱怨說,if
聲明WASN」 t正確。
只要添加暫停而不管它是如何打開的?如果它從命令提示符打開,除了無害的停頓之外沒有任何傷害。 (不是一個解決方案,但只是想暫停是否會如此有害/煩人)
我認爲這將是相當惱人的,至少對我而言。當然,必須有一些環境變量或狀態設置存在於一個地方,而不是我可以用來做出選擇的其他環境變量或狀態設置! – 2008-12-18 10:26:21
與第二批文件類似,如果未給出某個參數(通過單擊調用),也可以暫停。
這將意味着只有一個批處理文件,但必須指定一個-nopause
參數或從控制檯調用時類似的東西。
這是關於最好的手動解決方案,但我真的希望有一個自動的解決方案。也許在當前目錄上分支,雙擊時可能是不變的。理想情況下,只需使用最少的設置即可在任何地方工作,而無需使用快捷鍵。 – 2008-12-18 10:37:28
瘋狂的想法:使用tasklist並解析它的結果。 我已經在測試批處理文件中寫道:
任務列表> test.out
,當我雙擊它,有一個額外的「cmd.exe的」過程只是在任務列表過程之前,那WASN當腳本從命令行運行時(但是請注意,如果有人打開命令行shell然後雙擊該批處理文件可能不夠)
我使用參數「automode」,當我從腳本運行我的批處理文件。
set automode=%7
(這裏的自動模式是考慮到第七個參數。)
某些代碼如下,並在文件應暫停,我這樣做:
if @%automode%[email protected] pause
是。 Patrick Cuff的最後一個例子幾乎可以工作,但是你需要添加一個額外的轉義符'^',以使其在所有情況下都能正常工作。這對我的偉大工程:
set zero=%0
if [^%zero:~0,1%] == [^"] pause
但是,如果批處理文件的名稱包含空格,這將是雙在任何情況下引用,所以這個解決方案將無法工作。
下面是我用什麼:做
rem if double clicked it will pause
for /f "tokens=2" %%# in ("%cmdcmdline%") do if /i "%%#" equ "/c" pause
一個簡單的辦法就是在這裏描述: http://steve-jansen.github.io/guides/windows-batch-scripting/part-10-advanced-tricks.html 有在鏈接中提到的代碼小錯字。這裏是正確的代碼:
@ECHO OFF
SET interactive=0
ECHO %CMDCMDLINE% | FINDSTR /L %COMSPEC% >NUL 2>&1
IF %ERRORLEVEL%==0 SET interactive=1
ECHO do work
IF "%interactive%"==1 PAUSE
EXIT /B 0
另一個選項:%cmdcmdline%給出用於啓動當前Cmd.exe的確切命令行。從命令控制檯啓動時,此變量爲「%SystemRoot%\ system32.cmd.exe」。從資源管理器啓動時,這個變量是cmd/c「」[d:\ path \ script.bat]「」 – 2008-12-20 02:34:28