代码之家  ›  专栏  ›  技术社区  ›  Álvaro González

条件暂停(不在命令行中)

  •  14
  • Álvaro González  · 技术社区  · 14 年前

    我喜欢决赛 PAUSE 在我的*.bat脚本中,这样我就可以在Windows资源管理器中双击它们并有机会读取输出。但是,当我从命令行运行同一个脚本时,最后的暂停是一个麻烦。

    是否有任何方法可以检测我们是否在命令提示符下运行脚本并相应地插入暂停(或不插入)?

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

    更新

    我从安德斯的回答中得出了这个结论:

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

    然后,我可以这样做:

    if defined GUI pause
    
    3 回复  |  直到 8 年前
        1
  •  18
  •   Anders    8 年前
    @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
    
        2
  •  3
  •   Tom Smilack    14 年前

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

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

        3
  •  0
  •   skataben    10 年前

    我希望@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脚本相同。


    任何其他文件.bat

    @echo off
    call PauseIfGui.bat %~f0
    

    如果从资源管理器打开(即双击),则任何其他文件.bat都将暂停。如果从命令提示符调用,则不会调用。