检测批处理文件的执行方式

Dan*_*son 17 windows batch-file

假设有Windows,我是否可以从批处理文件中检测它是从打开的命令提示符启动还是双击?我想在批处理结束时添加一个暂停,当且仅当它被双击时,这样窗口不会随着它可能产生的任何有用输出而消失.

有什么聪明的方法吗?我正在寻找可以依赖的解决方案来处理使用默认设置或多或少配置的计算机.

Pat*_*uff 14

我刚刚进行了快速测试并注意到以下内容,这可能对您有所帮助:

  • 从打开的命令提示符运行时,%0变量在路径周围没有双引号.如果脚本驻留在当前目录中,则甚至不给出路径,只是批处理文件名.
  • 从资源管理器运行时,%0变量始终用双引号括起来,并包含批处理文件的完整路径.

如果从命令控制台运行,此脚本将不会暂停,但如果在资源管理器中双击,则该脚本将暂停:

@echo off
setlocal enableextensions

set SCRIPT=%0
set DQUOTE="

@echo do something...

@echo %SCRIPT:~0,1% | findstr /l %DQUOTE% > NUL
if %ERRORLEVEL% EQU 0 set PAUSE_ON_CLOSE=1

:EXIT
if defined PAUSE_ON_CLOSE pause
Run Code Online (Sandbox Code Playgroud)

编辑:从资源管理器运行时也有一些奇怪的行为,我无法解释.本来,而不是

@echo %SCRIPT:~0,1% | findstr /l %DQUOTE% > NUL
if %ERRORLEVEL% EQU 0 set PAUSE_ON_CLOSE=1
Run Code Online (Sandbox Code Playgroud)

我试过只用一个if:

if %SCRIPT:0,1% == ^" set PAUSE_ON_CLOSE=1
Run Code Online (Sandbox Code Playgroud)

从打开的命令提示符运行时,这将起作用,但是当从资源管理器运行时,它会抱怨该if语句不正确.

  • 另一个选项:%cmdcmdline%给出了用于启动当前Cmd.exe的确切命令行.从命令控制台启动时,此var为"%SystemRoot%\ system32.cmd.exe".从资源管理器启动时,此变量为cmd/c""[d:\ path\script.bat]"" (8认同)
  • 就个人而言,我确实会采用'%cmdcmdline%`方法,但要注意两个启动命令都可以在注册表中重写! (2认同)