如何判断批处理文件是否是从命令窗口运行的?

如何判断批处理文件是否是从命令窗口运行的?

我有一个批处理文件,希望能够通过在 Windows 资源管理器中双击该文件来运行它。完成后,我希望以暂停结束,这样窗口就不会立即关闭。

但是如果批处理文件是从命令 shell 运行的,我不希望以 PAUSE 结束。

有没有办法判断批处理文件中的程序是在 Windows 资源管理器生成的命令行中运行,还是在现有的命令 shell 中运行?

Bash 提供了特殊的 $- 环境变量。

cmd.exe 中是否有类似的东西?

答案1

这不是确切的解决方案,但您可以为 cmd 文件创建快捷方式并向目标添加命令行参数。当您需要从 Explorer 运行 cmd 时,您必须启动快捷方式,而不是 cmd 文件。在您的 cmd 文件中,您将测试 %1 参数以确定它是从快捷方式(从 Explorer)还是从命令提示符启动。

答案2

我在 Windows 10 上尝试了 Gene 的建议:

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

但这对我来说不起作用。但是,当我删除 %COMSPEC% 末尾的空格时,它确实起作用了:

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

我没有资格对原始帖子发表评论,但希望有人将其添加到 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
)

相关内容