Ben*_*ank 24 windows batch-file
有没有办法批处理文件(在这种情况下,在Windows XP上运行)来确定它是从命令行启动(即在控制台窗口内)还是通过shell启动(例如通过双击)?
我有一个脚本,我希望在通过shell运行时在某些点暂停,但不是在命令行运行时.我在SO上看到过类似的问题,但由于两个原因我无法使用相同的解决方案:首先,它是否暂停需要依赖于多个因素,其中只有一个是双击.其次,我将把这个脚本分发给我团队中的其他人,我无法真实地要求他们所有人进行注册表更改,这将影响所有脚本.
这可能吗?
Joe*_*oey 35
找到一个:-) - 在拼命思考cmd交互式运行时可能会做什么但在直接启动批处理文件时却没有...我终于找到了一个.
伪变量%cmdcmdline%包含用于启动的命令行cmd.如果cmd通常启动,则包含类似于以下内容的内容:
"C:\Windows\System32\cmd.exe"
Run Code Online (Sandbox Code Playgroud)
但是,在启动批处理文件时,它看起来像这样:
cmd /c ""C:\Users\Me\test.cmd" "
Run Code Online (Sandbox Code Playgroud)
小演示:
@echo off
for %%x in (%cmdcmdline%) do if /i "%%~x"=="/c" set DOUBLECLICKED=1
if defined DOUBLECLICKED pause
Run Code Online (Sandbox Code Playgroud)
但是,这种检查方式可能不是最强大的,但/c如果直接启动批处理文件,则应仅作为参数出现.
在我的机器上工作http://hypftier.de/dump/works_on_my_machine.png
在Windows 7 x64上进行了测试.它可能会或可能不会起作用,休息,做一些奇怪的事情,吃孩子(可能是一件好事)或咬你的鼻子.
综合答案,源自此页面上的大部分信息(以及其他一些具有类似问题的堆栈溢出页面).这个不依赖于detect/c,但实际上是在命令行中检查脚本的名称.因此,如果您双击另一个批次然后调用此批处理,此解决方案将不会暂停; 你必须双击这个特定的批处理文件.
:pauseIfDoubleClicked
setlocal enabledelayedexpansion
set testl=%cmdcmdline:"=%
set testr=!testl:%~nx0=!
if not "%testl%" == "%testr%" pause
Run Code Online (Sandbox Code Playgroud)
编辑:同样可以在一行中完成:
echo %cmdcmdline% | findstr /i /c:"%~nx0" && set standalone=1
Run Code Online (Sandbox Code Playgroud)
用简单的英语,这个
%cmdcmdline%传递给findstr,然后搜索当前脚本名称%0包含当前脚本名称,当然只有shift事先没有调用过%~nx0 从中提取文件名和扩展名 %0>NUL 2>&1通过将任何输出重定向到NUL来静音findstr&& 仅在前面的命令没有错误返回时执行standalone如果脚本是从命令行启动的,则不会定义稍后在脚本中我们可以做到:
if defined standalone pause
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5715 次 |
| 最近记录: |