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
)