2012-02-23 19 views
17

cmd.exeスクリプト—にパラメータがない場合、私は典型的な "usage:"行を持っています。ユーザにはスクリプトの使用方法を簡単に思い出させます。バッチスクリプトがコマンドライン(cmd)から開始/実行されたかどうかを確認する - または - 一時停止するか、一時停止しないか?

潜在的なユーザーがGUIまたはCLIを使用するかどうかは安全に予測できないという問題があります。 GUIを使用している人がエクスプローラウィンドウでこのスクリプトをダブルクリックすると、私はpauseウィンドウが表示されない限り、何も読む機会がありません。彼らがCLIを使用する場合、pauseはそれらを悩ますでしょう。

私はそれを検出する方法を探しています。

@echo off 
if _%1_==__ (
    echo usage: %nx0: filename 
    rem now pause or not to pause? 
) 

いい解がありますか?ここで

答えて

13

-joedfあなたは%CMDCMDLINE%変数の値を確認することができます。これには、cmd.exeを起動するために使用されたコマンドが含まれています。

私が.batファイルのテストを準備:cmd.exe開いているウィンドウの内部から実行すると

@Echo Off 
echo %CMDCMDLINE% 
pause 

、スクリプトが​​を印刷します。 ダブルクリックで実行するとcmd /c ""C:\Users\mbu\Desktop\test.bat" "

スクリプトがダブルクリックで起動したかどうかを確認するには、%cmdcmdline%にスクリプトのパスが含まれているかどうかを確認する必要があります。最終的な解決策は、次のようになります。

@echo off 

set interactive=1 
echo %cmdcmdline% | find /i "%~0" >nul 
if not errorlevel 1 set interactive=0 

rem now I can use %interactive% anywhere 

if _%1_==__ (
    echo usage: %~nx0 filename 
    if _%interactive%_==_0_ pause 
) 

編集:コメントで議論された問題の変更のための実装修正。彼らに

+0

十分な奇妙な:あなたは新しいcmd.exeのセッションを開いて、これを呼び出した場合、最初の時間それは一時停止します: 'find'は最初の試行で'%errorlevel% 'を発生しません。次の試行はうまくいきます。 –

+0

他のコマンド(私の場合は 'set'sと' cd'の典型的な組み合わせ)がこの構造の前に*存在すれば、 '%errorlevel%'の引き上げも失敗します。 –

+0

さらに、 'call:somesub'を使って呼び出されたサブルーチンでは動作しません。その場合、 '%cmdcmdline%'はそのサブルーチンのラベルのみを含みます: '%cmdcmdline%'。 –

1

は、私が何か...それは完璧ではない

Usage.bat


@echo off 
if arg%1==arg goto help 
goto action 

:action 
echo do something... 
goto end 

:help 
set help1=This is Help line 1. 
set help2=This is Help line 2. 
cmd.exe /k "echo %help1% &echo %help2%" 
goto end 

:end 

を書いたが、それは動作します! :D

4
:: exit if not interactive 
echo %CMDCMDLINE% | find /i "/c" 
if not ERRORLEVEL 1 goto:eof 
+0

これが受け入れられた回答とどのように違うかについてもっと詳しく説明できますか? –

0

を実証する例を編集します。findstr

echo %cmdcmdline% | findstr /ic:"%~f0" >nul && (pause >nul) 

または

setlocal EnableDelayedExpansion 
. 
. 
echo !cmdcmdline! | findstr /ic:"%~f0" >nul && (pause >nul) 
. 
. 
endlocal 

を使用してくださいこれは常に働いています...

+0

まあ、* findstr *は外部プログラムなので、実際は "from within"ですが、実行可能なオプションです。 –

+0

find.exe findstr.exe - これらはWindows内部のexeです。これは内部コマンドと似ています。 – kygg

0
内部コマンドのための

setlocal EnableDelayedExpansion 
set "cmddiff=!cmdcmdline:~0,1!" & if !cmddiff! neq ^" (pause >nul) 
endlocal 

または

setlocal EnableDelayedExpansion 
set "cmddiff=!cmdcmdline:~28,1!" & if !cmddiff! neq ^" (pause >nul) 
endlocal 

あなたは別のものを比較することができますが、これは唯一のEnableDelayedExpansion以内に加工されています。私はこれがいつも働いて、Windows版などを引き起こすとは思わない。

0

これは内部コマンドだけを使用している。そう効果....

EnableDelayedExpansion

if "!cmdcmdline!" neq "!cmdcmdline:%~f0=!" pause >nul 

又は

if not "!cmdcmdline!" == "!cmdcmdline:%~f0=!" pause >nul 

DisableDelayedExpansion

if "%cmdcmdline%" neq "%cmdcmdline:%~f0=%" pause >nul 

または

if not "%cmdcmdline%" == "%cmdcmdline:%~f0=%" pause >nul 
0
あなたのバッチは、次のように%のCMDCMDLINEの%で%WINDIR%のチェックを開始します

echo "%cmdcmdline%" | findstr /ic:"%windir%" >nul && (
    echo Interactive run of: %0 is not allowed 
    pause 
    exit /B 1 
) 
関連する問題