在双击时暂停batch file,但不从控制台窗口运行时暂停?

是否有一个batch file(在这种情况下,在Windows XP上运行),以确定它是从命令行(即在控制台窗口内)启动还是通过shell启动(例如通过双击)?

我有一个脚本,我希望在通过shell运行时在某些点暂停,而不是在命令行运行。 我在SO上看到过一个类似的问题 ,但是由于两个原因,我不能使用同样的解决scheme:首先,它是否暂停需要依赖于多个因素,其中只有一个是双击。 其次,我将把这个脚本分发给我的团队中的其他人,而且我不能要求所有人都进行registry更改,这将会影响到所有脚本。

这可能吗?

Solutions Collecting From Web of "在双击时暂停batch file,但不从控制台窗口运行时暂停?"

找到了一个:-) – 拼命想着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应该仅作为参数存在。

在我的机器上运行http://img.zgserver.com/windows/works_on_my_machine.png

在Windows 7 x64上进行测试。 它可能会或可能不会工作,打破,做一些奇怪的事,吃孩子(可能是一件好事),或咬你的鼻子。

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

 :pauseIfDoubleClicked setlocal enabledelayedexpansion set testl=%cmdcmdline:"=% set testr=!testl:%~nx0=! if not "%testl%" == "%testr%" pause 
  1. 变量“testl”得到了cmd处理器调用的全部行,剥去了所有讨厌的双引号。
  2. 变量“testr”需要“testl”,并且进一步去掉当前批处理文件名的名字(如果这个批处理文件是通过双击来调用的话)。
  3. if语句看“testl”和“testr”是否不同。 如果是,批量双击,暂停; 如果不是,则在命令行中键入批处理(或从另一个批处理文件中调用),继续。

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

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

用简单的英语,这个

  • %cmdcmdline%的值%cmdcmdline%findstr ,然后搜索当前的脚本名称
  • %0包含当前脚本名称,当然只有在事先没有调用过shift情况下
  • %~nx0%0提取文件名和扩展名
  • >NUL 2>&1 mutes findstr通过重定向任何输出到NUL
  • 如果找不到所讨论的子串, findstr会设置一个非零的错误级别
  • &&只有在前面的命令没有错误返回时才执行
  • 因此,如果脚本是从命令行启动的,则不会定义standalone

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

 if defined standalone pause 

一种方法可能是在c:\的根目录下创建一个autoexec.nt文件,如下所示:

 @set nested=%nested%Z 

在你的批处理文件中,检查%嵌套%是否为“Z” – 如果是“Z”,那么你已经双击了,所以暂停。 如果它不是“Z”,那么CMD将继承“父进程”的环境块,将成为“ZZ”或“ZZZ”等。

-Oisin

多一点信息…

我从一个批处理文件(test.cmd)开始,其中包含:

 @echo %cmdcmdline% 

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

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

从命令提示符窗口中执行“test.cmd”批处理文件时,显示
回声%cmdcmdline%取决于如何启动命令窗口…

如果我通过单击“Start-Orb”和“Command Prompt”来启动“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”(不太可能),那么上一个示例中的测试将无法正确测试此情况。