バッチ ファイルがコマンド ウィンドウから実行されたかどうかを確認するにはどうすればよいでしょうか?

バッチ ファイルがコマンド ウィンドウから実行されたかどうかを確認するにはどうすればよいでしょうか?

Windows エクスプローラーでファイルをダブルクリックして実行できるようにしたいバッチ ファイルがあります。これが完了したら、ウィンドウがすぐに閉じないように、一時停止で終了したいと思います。

しかし、バッチ ファイルをコマンド シェルから実行する場合には、PAUSE で終了しないことをお勧めします。

バッチ ファイル内で、それが Windows エクスプローラーから生成されたコマンド ラインで実行されているのか、既存のコマンド シェルから実行されているのかを判別する方法はありますか?

Bash は特別な $- 環境変数を提供します。

cmd.exe にも同様のものがありますか?

答え1

正確な解決策ではありませんが、cmd ファイルへのショートカットを作成し、ターゲットにコマンド ライン パラメータを追加することができます。エクスプローラーから cmd を実行する必要がある場合は、cmd ファイルではなくショートカットを起動する必要があります。cmd ファイルで %1 パラメータをテストして、ショートカット (エクスプローラーから) から起動したのか、コマンド プロンプトから起動したのかを識別します。

答え2

Windows 10 で Gene の提案を試してみました:

if /I Not "%CMDCMDLINE:"=%" == "%COMSPEC% " Pause

しかし、それはうまくいきませんでした。ただし、%COMSPEC% の末尾のスペースを削除すると、うまくいきました。

if /I Not "%CMDCMDLINE:"=%" == "%COMSPEC%" Pause

私には元の投稿にコメントするだけの評判はありませんが、誰かがこれを Gene の回答に追加し、彼の回答に賛成票を投じてくれることを望みます (Gene は私の問題を解決するための基礎を与えてくれたので)。

答え3

同様の質問に対する解決策をここに投稿しました:886848/ダブルクリック時に Windows バッチ ファイルを一時停止する方法

この解決策はあなたにとっては有効であるはずですが、おそらく必要以上に複雑です。

以下に短縮版を掲載しました。こちらの方がシンプルで、きっと役に立つはずです。

詳細については、上記のリンク先のソリューションを参照してください。基本的には、環境変数を使用して、%cmdcmdline%バッチ ファイルがコマンド ウィンドウから実行されたかどうかを判断します。

これは、バッチ ファイルの開始方法によって変数の内容%cmdcmdline%が異なるため機能します。1) Windows エクスプローラーやデスクトップなどからバッチ ファイルまたはショートカットをクリックした場合、または 2) コマンド プロンプト ウィンドウ内からバッチ ファイルを実行した場合です。

したがって、次のように使用します。

バッチ ファイルが終了する時点で、次のようなコードを追加します。

set newcmdcmdline=%cmdcmdline:"=-%
echo %newcmdcmdline% | find /i "cmd /c --%~dpf0%-"
set "result=%errorlevel%"

rem if %result% EQU 0 
rem     this batch file was executed by clicking a batch file 
rem     or a shortcut to a batch file, typically from Windows Explorer 
rem     or the Desktop, or the "Start Menu" ...

rem if %result% NEQ 0 
rem     this batch file was executed from within a Command Prompt

rem if executed from within a Command Prompt: 
rem     go exit the batch script immediately, without pausing. 
rem     since this batch file was executed from within a 
rem     Command Prompt, the command window will remain open. 
rem     You can use either of these to exit the batch file:
rem          goto :EOF
rem          exit /b

if %result% NEQ 0 goto :EOF

rem at this point, we know this batch file was executed by clicking ..., 
rem     NOT from within a Command Prompt. 

rem leave the command prompt window open to allow the user time to 
rem    view the messages on the screen before exiting. Use any of 
rem    these to pause and or interact with the user before exiting: 
rem        pause
rem        echo Message... &pause
rem        set /p "d=Message..."
rem        choice [Options...]
rem            (choice /? Displays help message for the Choice command)
rem        timeout /T wait-time [Options...]
rem            (timeout /? Displays help message for the Timeout command)

timeout /t 10
goto :EOF

答え4

与えられた回答はどれも、特にデスクトップからWindowsのショートカット経由で起動した場合や、FreeCommanderなどのサードパーティのファイルマネージャーから起動した場合には、すべてのケースで信頼できるものではありませんでした。

私にとって効果的なのは次の通りです:

if "%CMDCMDLINE:"=%" == "%COMSPEC%" (
  REM started via windows explorer
) else if "%CMDCMDLINE%" == "cmd.exe" (
  REM started via file manager (e.g. FreeCommander)
) else if "%CMDCMDLINE:"=%" == "%COMSPEC% /c %~dpf0 " (
  REM started in command window
) else (
  REM started from other batch file
)

関連情報