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

我喜欢在我的cmd.exe脚本中有一个典型的“用法:”行 – 如果缺less一个参数,用户将得到如何使用脚本的简单提示。

问题是我不能安全地预测潜在用户是否使用GUI或CLI。 如果有人使用GUI在资源pipe理器窗口中双击这个脚本,他们将没有机会读取任何东西,除非我pause窗口。 如果他们使用CLI, pause会困扰他们。

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

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

有没有一个很好的解决scheme呢?

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

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

 @Echo Off echo %CMDCMDLINE% pause 

当从打开的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 ) 

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

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

在这里,我写了一些东西

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

-joedf

请使用findstr

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

要么

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

这一直工作…

为内部命令

 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版本等…

这只是使用内部命令。 所以有效….

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