2008-12-18 20 views
16

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

任何聪明的方法来做到这一点?我正在寻找可以依靠的解决方案,以便在使用默认设置配置更多或更少的计算机上工作。

回答

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声明WASN” t正确。

+8

另一个选项:%cmdcmdline%给出用于启动当前Cmd.exe的确切命令行。从命令控制台启动时,此变量为“%SystemRoot%\ system32.cmd.exe”。从资源管理器启动时,这个变量是cmd/c“”[d:\ path \ script.bat]“” – 2008-12-20 02:34:28

-2

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

+3

我认为这将是相当恼人的,至少对我而言。当然,必须有一些环境变量或状态设置存在于一个地方,而不是我可以用来做出选择的其他环境变量或状态设置! – 2008-12-18 10:26:21

3

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

+2

但是如何找到哪一个打电话?我认为这让我们回到原来的问题? – Learning 2008-12-18 10:17:34

+0

嗨,学习。如果它们是从命令行运行的,则它们运行暂停(因为输出仍然可见),并且如果它们通过双击运行,那么它们双击一个暂停,以便它们可以看到结果然后关闭窗口 – hamishmcn 2008-12-18 10:27:59

0

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

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

+1

这是关于最好的手动解决方案,但我真的希望有一个自动的解决方案。也许在当前目录上分支,双击时可能是不变的。理想情况下,只需使用最少的设置即可在任何地方工作,而无需使用快捷键。 – 2008-12-18 10:37:28

-1

疯狂的想法:使用tasklist并解析它的结果。 我已经在测试批处理文件中写道:

任务列表> test.out

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

1

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

set automode=%7 

(这里的自动模式是考虑到第七个参数。)

某些代码如下,并在文件应暂停,我这样做:

if @%automode%[email protected] pause 
2

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

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

但是,如果批处理文件的名称包含空格,这将是双在任何情况下引用,所以这个解决方案将无法工作。

2

下面是我用什么:做

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