假设Windows有没有一种方法可以在批处理文件中检测到它是从打开的命令提示符还是通过双击启动?我想在批处理过程结束时添加一个暂停,当且仅当它被双击时,这个窗口不会随着它可能产生的任何有用输出而消失。检测批处理文件的执行方式
任何聪明的方法来做到这一点?我正在寻找可以依靠的解决方案,以便在使用默认设置配置更多或更少的计算机上工作。
假设Windows有没有一种方法可以在批处理文件中检测到它是从打开的命令提示符还是通过双击启动?我想在批处理过程结束时添加一个暂停,当且仅当它被双击时,这个窗口不会随着它可能产生的任何有用输出而消失。检测批处理文件的执行方式
任何聪明的方法来做到这一点?我正在寻找可以依靠的解决方案,以便在使用默认设置配置更多或更少的计算机上工作。
我刚跑过一个快速测试并注意到以下内容,这可以帮助你:
如果从命令控制台运行此脚本不会暂停,但在资源管理器中会如果双击:
@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正确。
只要添加暂停而不管它是如何打开的?如果它从命令提示符打开,除了无害的停顿之外没有任何伤害。 (不是一个解决方案,但只是想暂停是否会如此有害/烦人)
我认为这将是相当恼人的,至少对我而言。当然,必须有一些环境变量或状态设置存在于一个地方,而不是我可以用来做出选择的其他环境变量或状态设置! – 2008-12-18 10:26:21
与第二批文件类似,如果未给出某个参数(通过单击调用),也可以暂停。
这将意味着只有一个批处理文件,但必须指定一个-nopause
参数或从控制台调用时类似的东西。
这是关于最好的手动解决方案,但我真的希望有一个自动的解决方案。也许在当前目录上分支,双击时可能是不变的。理想情况下,只需使用最少的设置即可在任何地方工作,而无需使用快捷键。 – 2008-12-18 10:37:28
疯狂的想法:使用tasklist并解析它的结果。 我已经在测试批处理文件中写道:
任务列表> test.out
,当我双击它,有一个额外的“cmd.exe的”过程只是在任务列表过程之前,那WASN当脚本从命令行运行时(但是请注意,如果有人打开命令行shell然后双击该批处理文件可能不够)
我使用参数“automode”,当我从脚本运行我的批处理文件。
set automode=%7
(这里的自动模式是考虑到第七个参数。)
某些代码如下,并在文件应暂停,我这样做:
if @%automode%[email protected] pause
是。 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
一个简单的办法就是在这里描述: 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
另一个选项:%cmdcmdline%给出用于启动当前Cmd.exe的确切命令行。从命令控制台启动时,此变量为“%SystemRoot%\ system32.cmd.exe”。从资源管理器启动时,这个变量是cmd/c“”[d:\ path \ script.bat]“” – 2008-12-20 02:34:28