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

时间:2008-12-18 09:58:06

标签: windows batch-file

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

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

9 个答案:

答案 0 :(得分: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

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

@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语句不正确。

答案 1 :(得分:3)

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

答案 2 :(得分:3)

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

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

但是,如果批处理文件的名称包含空格,则在任何一种情况下都会双引号,因此此解决方案将无效。

答案 3 :(得分:2)

以下是我使用的内容:

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

答案 4 :(得分:1)

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

set automode=%7

(此处automode是给定的第七个参数。)

接下来是一些代码,当文件暂停时,我会这样做:

if @%automode%==@ pause

答案 5 :(得分:1)

这里描述了一种简单的方法: http://steve-jansen.github.io/guides/windows-batch-scripting/part-10-advanced-tricks.html 链接中提到的代码中几乎没有拼写错误。这是正确的代码:

@ECHO OFF
SET interactive=0

ECHO %CMDCMDLINE% | FINDSTR /L /I %COMSPEC% >NUL 2>&1
IF %ERRORLEVEL%==0 SET interactive=1

ECHO do work

IF "%interactive%"==1 PAUSE
EXIT /B 0

答案 6 :(得分:0)

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

这意味着只有一个批处理文件,但在从控制台调用时必须指定-nopause参数。

答案 7 :(得分:-1)

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

任务列表> test.out

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

答案 8 :(得分:-2)

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