确定是否已从命令行(cmd)启动/执行批处理脚本 - 或 - 要暂停还是不暂停?

Alo*_*dal 23 windows cmd batch-file

我喜欢在我的cmd.exe脚本中有一个典型的"usage:"行- 如果缺少一个参数,用户可以简单地提醒我们如何使用脚本.

问题是我无法安全地预测潜在用户是否会使用GUI或CLI.如果有人使用GUI在资源管理器窗口中双击此脚本,他们就没有机会阅读任何内容,除非我pause在窗口中.如果他们使用CLI,pause会打扰他们.

所以我正在寻找一种方法来检测它.

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

有一个很好的解决方案吗?

MBu*_*MBu 18

您可以检查%CMDCMDLINE%变量的值.它包含用于启动的命令cmd.exe.

我准备了一个测试.bat文件:

@Echo Off
echo %CMDCMDLINE%
pause
Run Code Online (Sandbox Code Playgroud)

从打开的cmd.exe窗口内部运行时,脚本将打印出来"C:\Windows\system32\cmd.exe".双击运行时,会打印出来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
)
Run Code Online (Sandbox Code Playgroud)

编辑:针对评论中讨论的问题更改实施的修复; 编辑过的例子来演示它们


cmc*_*nty 5

:: exit if not interactive
echo %CMDCMDLINE% | find /i "/c"
if not ERRORLEVEL 1 goto:eof
Run Code Online (Sandbox Code Playgroud)