我有一个bat文件,可以执行大量操作并关闭cmd窗口,当用户从资源管理器中双击bat文件时,该窗口很好.但是,如果我从cmd> c:\ myfile.bat中已经打开的cmd窗口运行bat文件,那么我不希望bat文件关闭cmd窗口(END),因为我需要做其他事情.我需要bat dos命令代码,它会做类似的事情
if (initiated_from_explorer) then
else
endif
Run Code Online (Sandbox Code Playgroud)
这可能吗 ?谢谢
mou*_*sio 14
%cmdcmdline%
给出用于启动当前Cmd.exe的确切命令行.
"%SystemRoot%\system32\cmd.exe"
.cmd /c ""{full_path_to_the_bat_file}" "
; %0
bat文件中的变量,因为在这种情况下,它始终是bat文件的完整路径,并且始终用双引号括起来.就个人而言,我会选择%cmdcmdline%
(而不是%O
)方法,但请注意,两个启动命令都可以在注册表中重写...
Jea*_* T. 14
来自"mousio"的解决方案很好; 但是,我个人并没有设法使它在"IF"语句中工作,因为值的双引号%cmdcmdline%
(带或不带双引号%cmdcmdline%
).
但是,使用的解决方案%0
工作正常.我使用了以下块语句,它就像一个魅力:
IF %0 == "%~0" pause
Run Code Online (Sandbox Code Playgroud)
如果以前的解决方案没有(Alex Essilfie的追求),以下解决方案也可能有效:
IF %0 EQU "%~dpnx0" PAUSE
Run Code Online (Sandbox Code Playgroud)
希望它可以提供帮助.
在其他答案的基础上,我找到了最可靠的方法:
x
可在不破坏 IF 语句的情况下启用文本比较。x
)。set "dclickcmdx=%comspec% /c xx%~0x x"
set "actualcmdx=%cmdcmdline:"=x%"
set isdoubleclicked=0
if /I "%dclickcmdx%" EQU "%actualcmdx%" (
set isdoubleclicked=1
)
Run Code Online (Sandbox Code Playgroud)
这增加了针对一般调用的鲁棒性cmd /c
,因为 Explorer 在最后一个 quote/x 之前添加了一个尴尬的额外空格(对我们有利)。如果cmdcmdline
没有找到,它会正确呈现isdoubleclicked=0
。
与上述方法类似,如果从资源管理器中双击脚本,则以下一行将暂停脚本。我将其添加到脚本末尾以保持命令行窗口打开:
(编辑 2022-01-12,修复了此讨论中的引用不匹配问题)
if /i "%comspec% /c ``%~0` `" equ "%cmdcmdline:"=`%" pause
Run Code Online (Sandbox Code Playgroud)
if /i "%comspec% /c %~0 " equ "%cmdcmdline:"=%" pause
Run Code Online (Sandbox Code Playgroud)
综合答案,源自此页面上的大部分信息:
:pauseIfDoubleClicked
setlocal enabledelayedexpansion
set testl=%cmdcmdline:"=%
set testr=!testl:%~nx0=!
if not "%testl%" == "%testr%" pause
Run Code Online (Sandbox Code Playgroud)
当然,如果您在检测到双击时想要执行其他操作,则可以更改暂停.
感谢大家.
归档时间: |
|
查看次数: |
9443 次 |
最近记录: |