我喜欢在我的* .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
答案 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%环境变量,我想这对于一些边缘情况可能有点不同。
@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脚本运行相同。
@echo off
call PauseIfGui.bat %~f0
如果从资源管理器中打开(即双击),AnyOtherFile.bat将暂停。如果从命令提示符调用,则不会。