我喜欢在我的cmd.exe
脚本中使用典型的“usage:”行 - 如果缺少参数,则会简单地提示用户如何使用脚本。
问题是我无法安全地预测潜在用户是否会使用GUI或CLI。如果有人使用GUI在资源管理器窗口中双击此脚本,他们就没有机会阅读任何内容,除非我pause
窗口。如果他们使用CLI,pause
会打扰他们。
所以我正在寻找一种方法来检测它。
@echo off
if _%1_==__ (
echo usage: %nx0: filename
rem now pause or not to pause?
)
对此有一个很好的解决方案吗?
答案 0 :(得分:16)
您可以检查%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
)
编辑已针对评论中讨论的问题更改实施了修复程序;编辑示例来演示它们
答案 1 :(得分:5)
:: exit if not interactive
echo %CMDCMDLINE% | find /i "/c"
if not ERRORLEVEL 1 goto:eof
答案 2 :(得分:1)
在这里,我写了一些东西......
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
答案 3 :(得分:1)
这仅使用内部命令。如此有效....
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
答案 4 :(得分:1)
开始批量检查%cmdcmdline%中的%WINDIR%,如下所示:
echo "%cmdcmdline%" | findstr /ic:"%windir%" >nul && (
echo Interactive run of: %0 is not allowed
pause
exit /B 1
)
答案 5 :(得分:0)
请使用 findstr
echo %cmdcmdline% | findstr /ic:"%~f0" >nul && ( pause >nul )
或
setlocal EnableDelayedExpansion
.
.
echo !cmdcmdline! | findstr /ic:"%~f0" >nul && ( pause >nul )
.
.
endlocal
总是有效......
答案 6 :(得分:0)
用于内部命令
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版本等......
答案 7 :(得分:0)
相似的方法...
setlocal
set startedFromExplorer=
echo %cmdcmdline% | find /i "cmd.exe /c """"%~0""" >nul
if not errorlevel 1 set startedFromExplorer=1
...
if defined startedFromExplorer pause
goto :EOF
答案 8 :(得分:0)
setlocal EnableDelayedExpansion
if "!cmdcmdline!" neq "!cmdcmdline:%comspec%=!" ( pause>nul )
测试在Windows 10中完成。使用%windir%有点危险或模棱两可。因此,%comspec%非常安全。