2008-12-18 21 views
16

假設Windows有沒有一種方法可以在批處理文件中檢測到它是從打開的命令提示符還是通過雙擊啓動?我想在批處理過程結束時添加一個暫停,當且僅當它被雙擊時,這個窗口不會隨着它可能產生的任何有用輸出而消失。檢測批處理文件的執行方式

任何聰明的方法來做到這一點?我正在尋找可以依靠的解決方案,以便在使用默認設置配置更多或更少的計算機上工作。

回答

14

我剛跑過一個快速測試並注意到以下內容,這可以幫助你:

  • 當從一個開放命令提示符下,%0變量在路徑中沒有雙引號。如果腳本駐留在當前目錄中,則甚至不會提供路徑,只是批處理文件名。
  • 從資源管理器運行時,%0變量總是用雙引號括起來,幷包含批處理文件的完整路徑。

如果從命令控制檯運行此腳本不會暫停,但在資源管理器中會如果雙擊:

@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正確。

+8

另一個選項:%cmdcmdline%給出用於啓動當前Cmd.exe的確切命令行。從命令控制檯啓動時,此變量爲「%SystemRoot%\ system32.cmd.exe」。從資源管理器啓動時,這個變量是cmd/c「」[d:\ path \ script.bat]「」 – 2008-12-20 02:34:28

-2

只要添加暫停而不管它是如何打開的?如果它從命令提示符打開,除了無害的停頓之外沒有任何傷害。 (不是一個解決方案,但只是想暫停是否會如此有害/煩人)

+3

我認爲這將是相當惱人的,至少對我而言。當然,必須有一些環境變量或狀態設置存在於一個地方,而不是我可以用來做出選擇的其他環境變量或狀態設置! – 2008-12-18 10:26:21

3

不要忽視有兩個批處理文件的解決方案:
abatfile.bat和abatfile與 - pause.bat
第二隻需調用第一個並添加暫停

+2

但是如何找到哪一個打電話?我認爲這讓我們回到原來的問題? – Learning 2008-12-18 10:17:34

+0

嗨,學習。如果它們是從命令行運行的,則它們運行暫停(因爲輸出仍然可見),並且如果它們通過雙擊運行,那麼它們雙擊一個暫停,以便它們可以看到結果然後關閉窗口 – hamishmcn 2008-12-18 10:27:59

0

與第二批文件類似,如果未給出某個參數(通過單擊調用),也可以暫停。

這將意味着只有一個批處理文件,但必須指定一個-nopause參數或從控制檯調用時類似的東西。

+1

這是關於最好的手動解決方案,但我真的希望有一個自動的解決方案。也許在當前目錄上分支,雙擊時可能是不變的。理想情況下,只需使用最少的設置即可在任何地方工作,而無需使用快捷鍵。 – 2008-12-18 10:37:28

-1

瘋狂的想法:使用tasklist並解析它的結果。 我已經在測試批處理文件中寫道:

任務列表> test.out

,當我雙擊它,有一個額外的「cmd.exe的」過程只是在任務列表過程之前,那WASN當腳本從命令行運行時(但是請注意,如果有人打開命令行shell然後雙擊該批處理文件可能不夠)

1

我使用參數「automode」,當我從腳本運行我的批處理文件。

set automode=%7 

(這裏的自動模式是考慮到第七個參數。)

某些代碼如下,並在文件應暫停,我這樣做:

if @%automode%[email protected] pause 
2

是。 Patrick Cuff的最後一個例子幾乎可以工作,但是你需要添加一個額外的轉義符'^',以使其在所有情況下都能正常工作。這對我的偉大工程:

set zero=%0 
if [^%zero:~0,1%] == [^"] pause 

但是,如果批處理文件的名稱包含空格,這將是雙在任何情況下引用,所以這個解決方案將無法工作。

2

下面是我用什麼:做

rem if double clicked it will pause 
for /f "tokens=2" %%# in ("%cmdcmdline%") do if /i "%%#" equ "/c" pause