代码之家  ›  专栏  ›  技术社区  ›  Ben Blank Jarret Hardie

双击时暂停批处理文件,但从控制台窗口运行时不暂停?

  •  23
  • Ben Blank Jarret Hardie  · 技术社区  · 16 年前

    我有一个脚本,当通过shell运行时,我想在某些点暂停,但在命令行上运行时不想。我见过 a similar question 因此,我无法使用相同的解决方案有两个原因:第一,它是否暂停需要取决于多个因素,其中只有一个因素是是否双击。第二,我将把这个脚本分发给我的团队中的其他人,我不能实际地要求所有人进行注册表更改,这将影响所有脚本。

    这可能吗?

    4 回复  |  直到 9 年前
        1
  •  35
  •   Glorfindel Doug L.    7 年前

    找到一个:-)拼命想了想什么 cmd 可能在以交互方式运行时执行,但在直接启动批处理文件时不执行。。。我终于找到了一个。

    %cmdcmdline% 包含用于启动的命令行 命令 正常启动时,它包含类似以下内容:

    "C:\Windows\System32\cmd.exe"
    

    但是,在启动批处理文件时,它如下所示:

    cmd /c ""C:\Users\Me\test.cmd" "
    

    小型演示:

    @echo off
    for %%x in (%cmdcmdline%) do if /i "%%~x"=="/c" set DOUBLECLICKED=1
    if defined DOUBLECLICKED pause
    

    不过,这种检查方法可能不是最可靠的,但是 /c 仅当批处理文件直接启动时才应作为参数显示。

    Works on my machine

        2
  •  10
  •   Tomalak    10 年前

    一个综合的答案,来自于这个页面上的大部分信息(以及其他一些有类似问题的堆栈溢出页面)。这个不依赖于检测/c,而是在命令行中实际检查脚本的名称。因此,如果您双击另一个批处理,然后调用此批处理,则此解决方案不会暂停;您必须双击此特定批处理文件。

    :pauseIfDoubleClicked
    setlocal enabledelayedexpansion
    set testl=%cmdcmdline:"=%
    set testr=!testl:%~nx0=!
    if not "%testl%" == "%testr%" pause
    
    1. 变量“testr”接受“testl”,并进一步去掉当前批处理文件名的名称(如果双击调用批处理文件,则为当前批处理文件名)。
    2. if语句查看“testl”和“testr”是否不同。如果是,则双击批处理,因此暂停;如果不是,则在命令行中键入批处理(或从另一批处理文件调用批处理),继续。

    echo %cmdcmdline% | findstr /i /c:"%~nx0" && set standalone=1
    

    简单地说,这是

    • 管道的价值 %cmdcmdline% ,然后搜索当前脚本名称
    • %0 包含当前脚本名,当然只有在 shift 没有事先打过电话
    • %~nx0 %0
    • >NUL 2>&1 静音 findstr公司 通过将任何输出重定向到NUL
    • findstr公司 如果找不到有问题的子字符串,则设置非零errorlevel
    • && 只有在前面的命令返回时没有错误时才执行
    • standalone

    在脚本的后面我们可以做:

    if defined standalone pause
    
        3
  •  2
  •   x0n    16 年前

    一种方法可能是创建自动执行.ntc:\根目录中的文件,类似于:

    @set nested=%nested%Z
    

    在批处理文件中,检查%nested%是否为“Z”-如果为“Z”,则表示您已被双击,因此暂停。如果不是“Z”,它将是“ZZ”或“ZZZ”等,因为CMD继承父进程的环境块。

        4
  •  0
  •   Kevin Fegan    14 年前

    更多信息。。。

    我从一个批处理文件开始(测试.cmd)包含:

    @echo %cmdcmdline%
    

    如果我双击“test.cmd在Windows资源管理器中的批处理文件中,echo%cmdline%的显示为:

    cmd /c ""D:\Path\test.cmd" "
    

    执行“时”测试.cmd从命令提示符窗口中的批处理文件
    echo%cmdline%取决于命令窗口的启动方式。。。

    “如果我开始”命令提示符单击“启动Orb”和“命令提示符”,或者单击“启动Orb”并执行命令提示符”从“搜索/运行”框中。然后我执行“测试.cmd批处理文件,echo%cmdline%的显示为:

    "C:\Windows\system32\cmd.exe"
    

    另外,对我来说,如果我从桌面快捷方式中单击“命令提示符”,则执行test.cmd“批处理文件中,echo%cmdline%的显示也是:

    “C:\Windows\system32\命令提示符"
    

    但是,如果我在Windows资源管理器窗口中“右键单击”并选择“在此处打开命令提示符”,则执行测试.cmd批处理文件,echo%cmdline%的显示为:

    "C:\Windows\System32\cmd.exe" /k ver
    

    所以,小心点,如果你开始命令提示符如果快捷方式在“Target”字段中包含“/c”(不太可能),则上一个示例中的测试将无法正确测试此情况。

    推荐文章