检测batch file的执行方式

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

任何聪明的方法来做到这一点? 我正在寻找可以依赖的解决scheme,以使用默认设置configuration更多或更less的机器。

Solutions Collecting From Web of "检测batch file的执行方式"

我只是跑了一个快速测试,注意到以下内容,这可能会帮助你:

  • 从打开的命令提示符运行时,%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 

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

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

我试过只用一个if

 if %SCRIPT:0,1% == ^" set PAUSE_ON_CLOSE=1 

这从一个打开的命令提示符下运行,但从资源管理器运行时,它会抱怨if语句不正确。

不要忽视有两个批处理文件的解决方案:
abatfile.bat和abatfile-with-pause.bat
第二个简单地调用第一个,并添加一个暂停

是。 Patrick Cuff的最后一个例子几乎可以工作,但是你需要添加一个额外的转义符号'^',以使其在所有情况下都能正常工作。 这对我很好:

 set zero=%0 if [^%zero:~0,1%] == [^"] pause 

但是,如果批处理文件的名称中包含空格,则无论在哪种情况下都将使用双引号,因此此解决方案不起作用。

以下是我使用的:

 rem if double clicked it will pause for /f "tokens=2" %%# in ("%cmdcmdline%") do if /i "%%#" equ "/c" pause 

当我从脚本运行我的批处理文件时,我使用了一个参数“automode”。

 set automode=%7 

(这里automode是给定的第七个参数。)

一些代码如下,当文件应该暂停时,我这样做:

 if @%automode%==@ pause 

与第二个批处理文件类似,如果没有给出某个参数(通过单击调用),也可以暂停。

这将意味着只有一个批处理文件,但必须指定一个-nopause参数或类似的东西,当从控制台调用。

这里描述一个简单的方法: http ://steve-jansen.github.io/guides/windows-batch-scripting/part-10-advanced-tricks.html链接中提到的代码中有小小的错字。 这是正确的代码:

 @ECHO OFF SET interactive=0 ECHO %CMDCMDLINE% | FINDSTR /L %COMSPEC% >NUL 2>&1 IF %ERRORLEVEL%==0 SET interactive=1 ECHO do work IF "%interactive%"==1 PAUSE EXIT /B 0 

疯狂的想法:使用任务列表并解析它的结果。 我在一个测试批处理文件中写道:

tasklist> test.out

当我双击它的时候,在任务列表进程之前还有一个额外的“cmd.exe”进程,当脚本从命令行运行的时候没有这个进程(但是请注意,如果有人打开一个命令行shell,然后双击该批处理文件)

只要添加暂停,不管它是如何打开的? 如果从命令提示符打开,除了无害的停顿之外没有任何伤害。 (不是一个解决方案,而只是想暂停会是如此有害/烦人)