条件PAUSE(不在命令行中)

时间:2010-10-14 15:04:28

标签: batch-file

我喜欢在我的* .bat脚本中有一个最终PAUSE所以我可以在Windows资源管理器中双击它们并有机会阅读输出。但是,当我从命令行运行相同的脚本时,最终的PAUSE是一个烦恼。

有没有办法检测我们是否从命令提示符运行脚本(或不是)并相应地插入PAUSE?

(目标环境是Windows XP及更高版本。)

更新

我已经设法从安德斯的回答中写出这个:

(((echo.%cmdcmdline%)|find /I "%~0")>nul)
if %errorlevel% equ 0 (
    set GUI=1
) else (
    set CLI=1
)

然后,我可以做这样的事情:

if defined GUI pause

3 个答案:

答案 0 :(得分:18)

@echo off
echo.Hello World
(((echo.%cmdcmdline%)|find /I "%~0")>nul)&&pause

...仅限NT +,可能在Win9x中没有%cmdcmdline%。

正如E M在评论中指出的那样,将所有这些放在一行上会打开一些边缘情况,其中%cmdcmdline%将从括号中转出。解决方法是使用两行:

@echo off
echo.Hello World

echo.%cmdcmdline% | find /I "%~0" >nul
if not errorlevel 1 pause

答案 1 :(得分:3)

我怀疑是否有区别,因为我认为它只是启动一个命令提示符,然后当你双击它时运行它。

但是,如果您创建了bat文件的快捷方式并转到属性并在“目标”字段中添加了一个额外的参数(类似“/ p”),那么您可以检查该参数是否存在脚本结束并暂停(如果已设置)。然后,从快捷方式运行会导致它以暂停结束,而不会从命令行运行。

答案 2 :(得分:0)

我希望@Anders的答案可以在自己的.bat文件中运行。不幸的是,它不适合我。基于@ DarinH的评论,或许对一些人来说。下面的脚本应该适用于所有人,但需要额外的参数。

关键在于%CmdCmdLine%环境变量,我想这对于一些边缘情况可能有点不同。


PauseIfGui.bat

@echo off
if "%~1" == "" ((echo.%CmdCmdLine%)|"%WinDir%\System32\find.exe" /I "%~0")>nul && pause & exit /b
((echo.%CmdCmdLine%)|"%WinDir%\System32\find.exe" /I "%~1")>nul && pause

这接受一个可选参数:调用脚本的完整路径。如果没有传递参数,则它与@Anders脚本运行相同。


AnyOtherFile.bat

@echo off
call PauseIfGui.bat %~f0

如果从资源管理器中打开(即双击),AnyOtherFile.bat将暂停。如果从命令提示符调用,则不会。