确定是否已从命令行(cmd)启动/执行批处理脚本 - 或 - 要暂停还是不暂停?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了确定是否已从命令行(cmd)启动/执行批处理脚本 - 或 - 要暂停还是不暂停?相关的知识,希望对你有一定的参考价值。

我喜欢在我的cmd.exe脚本中有一个典型的“usage:”行 - 如果缺少一个参数,用户可以简单地提醒我们如何使用脚本。

问题是我无法安全地预测潜在用户是否会使用GUI或CLI。如果有人使用GUI在资源管理器窗口中双击此脚本,他们就没有机会阅读任何内容,除非我在窗口中使用pause。如果他们使用CLI,pause会打扰他们。

所以我正在寻找一种方法来检测它。

@echo off
if _%1_==__ (
    echo usage: %nx0: filename
    rem now pause or not to pause?
)

有一个很好的解决方案吗?

答案

你可以检查%CMDCMDLINE%变量的值。它包含用于启动cmd.exe的命令。

我准备了一个测试.bat文件:

@Echo Off
echo %CMDCMDLINE%
pause

从打开的cmd.exe窗口内部运行时,脚本会打印"C:Windowssystem32cmd.exe"。通过双击运行时,它会打印cmd /c ""C:UsersmbuDesktop est.bat" "

因此,要检查脚本是否通过双击启动,您需要检查%cmdcmdline%是否包含脚本的路径。最终解决方案如下所示:

@echo off

set interactive=1
echo %cmdcmdline% | find /i "%~0" >nul
if not errorlevel 1 set interactive=0

rem now I can use %interactive% anywhere

if _%1_==__ (
    echo usage: %~nx0 filename
    if _%interactive%_==_0_ pause
)

编辑:针对评论中讨论的问题更改实施的修复;编辑过的例子来演示它们

另一答案
:: exit if not interactive
echo %CMDCMDLINE% | find /i "/c"
if not ERRORLEVEL 1 goto:eof
另一答案

在这里,我写了一些东西......

Usage.bat


@echo off
if arg%1==arg goto help
goto action

:action
echo do something...
goto end

:help
set help1=This is Help line 1.
set help2=This is Help line 2.
cmd.exe /k "echo %help1% &echo %help2%"
goto end

:end

它并不完美,但它确实有效! :d

-joedf

另一答案

这只是使用内部命令。如此有效....

EnableDelayedExpansion

if "!cmdcmdline!" neq "!cmdcmdline:%~f0=!" pause >nul

要么

if not "!cmdcmdline!" == "!cmdcmdline:%~f0=!" pause >nul

DisableDelayedExpansion

if "%cmdcmdline%" neq "%cmdcmdline:%~f0=%" pause >nul

要么

if not "%cmdcmdline%" == "%cmdcmdline:%~f0=%" pause >nul
另一答案

在%cmdcmdline%中开始批量检查%WINDIR%,如下所示:

echo "%cmdcmdline%" | findstr /ic:"%windir%" >nul && (
  echo Interactive run of: %0 is not allowed
  pause
  exit /B 1
)
另一答案

请使用findstr

echo %cmdcmdline% | findstr /ic:"%~f0" >nul && ( pause >nul )

要么

setlocal EnableDelayedExpansion
.
.
echo !cmdcmdline! | findstr /ic:"%~f0" >nul && ( pause >nul )
.
.
endlocal

这总是奏效的......

另一答案

用于内部命令

setlocal EnableDelayedExpansion
set "cmddiff=!cmdcmdline:~0,1!" & if !cmddiff! neq ^" ( pause >nul )
endlocal

要么

setlocal EnableDelayedExpansion
set "cmddiff=!cmdcmdline:~28,1!" & if !cmddiff! neq ^" ( pause >nul )
endlocal

您可以比较不同的东西,但这只能在EnableDelayedExpansion中使用。我不认为这将永远有效,导致Windows版本等...

另一答案

类似方法......

setlocal

set startedFromExplorer=
echo %cmdcmdline% | find /i "cmd.exe /c """"%~0""" >nul
if not errorlevel 1 set startedFromExplorer=1

...

if defined startedFromExplorer pause
goto :EOF
另一答案
setlocal EnableDelayedExpansion

if "!cmdcmdline!" neq "!cmdcmdline:%comspec%=!" ( pause>nul )

测试在Windows 10中完成。使用%windir%,它有点危险或模棱两可。所以%comspec%是超级安全的。

以上是关于确定是否已从命令行(cmd)启动/执行批处理脚本 - 或 - 要暂停还是不暂停?的主要内容,如果未能解决你的问题,请参考以下文章

如何用命令行打开sql sever

如何用命令行打开sql sever

R GC() CMD 批处理执行时间上的垃圾收集

从 Perl 脚本执行 .net 命令行应用程序

win7下 怎么通过运行命令行快速启动nodejs

bat 脚本执行cmd命令代码实例 执行后不关闭窗口 可以继续输入方法