我喜欢在我的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