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

时间:2010-08-23 21:33:10

标签: windows batch-file

批处理文件(在这种情况下,在Windows XP上运行)是否有办法确定它是从命令行启动(即在控制台窗口内)还是通过shell启动(例如通过双击) ?

我有一个脚本,我希望在通过shell运行时在某些点暂停,但不是在命令行运行时。我在SO上看过a similar question,但由于两个原因我无法使用相同的解决方案:首先,它是否暂停需要依赖于多个因素,其中只有一个因素是双击。其次,我将把这个脚本分发给我团队中的其他人,我无法真实地要求他们所有人进行注册表更改,这将影响所有脚本。

这可能吗?

4 个答案:

答案 0 :(得分:34)

找到一个:-) - 在拼命思考cmd交互式运行时可能会做什么而不是直接启动批处理文件时...我终于找到了一个。

伪变量%cmdcmdline%包含用于启动cmd的命令行。如果cmd正常启动,则包含类似于以下内容的内容:

"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 http://hypftier.de/dump/works_on_my_machine.png

在Windows 7 x64上进行了测试。它可能会或可能不会起作用,休息,做一些奇怪的事,吃孩子(可能是好事)或咬你的鼻子。

答案 1 :(得分:7)

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

:pauseIfDoubleClicked
setlocal enabledelayedexpansion
set testl=%cmdcmdline:"=%
set testr=!testl:%~nx0=!
if not "%testl%" == "%testr%" pause
  1. 变量" testl"获取cmd处理器调用的完整行,删除所有令人讨厌的双引号。
  2. 变量" testr"需要"测试"并且进一步剥离当前批处理文件名的名称(如果存在则通过双击调用批处理文件)。
  3. if语句查看" testl"和" testr"是不同的。如果是,则双击批次,暂停;如果不是,则在命令行输入批处理(或从另一个批处理文件调用),继续。

  4. 编辑:同样可以在一行中完成:

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

    用简单的英语,这个

    • %cmdcmdline%的值传递给 findstr ,然后搜索当前脚本名称
    • %0包含当前脚本名称,当然只有在事先没有调用shift的情况下
    • %~nx0%0
    • 中提取文件名和扩展名
    • >NUL 2>&1通过将任何输出重定向到NUL来消除 findstr
    • findstr 如果无法找到有问题的子字符串,则设置非零错误级别
    • &&仅在前面的命令无错误地返回时执行
    • 因此,如果脚本是从命令行启动的话,则不会定义standalone

    稍后在脚本中我们可以做到:

    if defined standalone pause
    

答案 2 :(得分:2)

一种方法可能是在c:\的根目录中创建一个autoexec.nt文件,它看起来像:

@set nested=%nested%Z

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

-Oisin

答案 3 :(得分:0)

更多信息......

我从一个包含以下内容的批处理文件(test.cmd)开始。

@echo %cmdcmdline%

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

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

在命令提示符窗口中执行“test.cmd”批处理文件时,显示
echo%cmdcmdline%取决于命令窗口的启动方式......

如果我通过单击“Start-Orb”和“命令提示符”启动“cmd.exe”,或者单击“Start-Orb”并从搜索/运行框中执行“cmd.exe”。然后我执行“test.cmd”批处理文件,echo%cmdcmdline%的显示为:

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

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

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

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

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

所以,请注意,如果从“Target”字段中包含“/ c”的快捷方式启动“cmd.exe”(不太可能),那么上一个示例中的测试将无法测试此情况正常。