批处理文件(在这种情况下,在Windows XP上运行)是否有办法确定它是从命令行启动(即在控制台窗口内)还是通过shell启动(例如通过双击) ?
我有一个脚本,我希望在通过shell运行时在某些点暂停,但不是在命令行运行时。我在SO上看过a similar question,但由于两个原因我无法使用相同的解决方案:首先,它是否暂停需要依赖于多个因素,其中只有一个因素是双击。其次,我将把这个脚本分发给我团队中的其他人,我无法真实地要求他们所有人进行注册表更改,这将影响所有脚本。
这可能吗?
答案 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
编辑:同样可以在一行中完成:
echo %cmdcmdline% | findstr /i /c:"%~nx0" && set standalone=1
用简单的英语,这个
%cmdcmdline%
的值传递给 findstr ,然后搜索当前脚本名称%0
包含当前脚本名称,当然只有在事先没有调用shift
的情况下%~nx0
从%0
>NUL 2>&1
通过将任何输出重定向到NUL来消除 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”(不太可能),那么上一个示例中的测试将无法测试此情况正常。