我能否防止Windows批处理文件通过双击执行?

4

是否有可能设置一个Windows .BAT文件,使得当从CMD调用时可以执行,但当有人双击该文件时不运行?


2
看一下这个DosTips.com的帖子。 - Squashman
你意识到你的问题标题与你在描述中写的相矛盾。你的问题标题应该只写“在交互式会话中”。 - Squashman
@Squashman 我不确定你的意思。如果从 CMD(交互式)启动,我希望它运行。如果从双击(非交互式)启动,则希望防止其运行。我看不到任何矛盾之处。 - IDDQD
你对术语的理解是错误的。双击批处理文件将是交互式的。从控制台运行通常被认为是非交互式的,因为控制台程序可以在没有用户登录的情况下运行。 - Squashman
我会修改问题。 - IDDQD
2个回答

8

环境变量%cmdcmdline%包含启动CMD.exe的命令行。如果批处理文件是从资源管理器或桌面上的单击启动的,则为:

C:\Path\To\cmd.exe /c ""c:\path\to\batch\file.bat" "

批处理文件的完整路径也可以在批处理文件内部作为 %~f0 访问,以与该变量进行比较。


当我单击时,我得到了这个:C:\windows\system32\cmd.exe /c ""C:\BatchFiles\CMDCMDLINE\test.bat" " - Squashman
仍然没有一种确定的方法来检测批处理文件是从控制台还是资源管理器启动的。我可以像上面发布的那样从cmd提示符中执行批处理文件,而CMDCMDLINE变量看起来就像从资源管理器启动时一样。 - Squashman
3
当你通过手动输入“c:...\cmd.exe /c ""c:\full\path\to\batch.bat" "”来从CMD启动批处理文件时,你知道自己在做什么,并且你是在与系统对抗而不是与其合作。 - Govind Parmar
3
@GovindParmar,系统环境变量%ComSpec%应该是cmd.exe的全路径,至少在Vista系统之后是这样。但我认为备用命令解释器可以替换该值。Windows目录(即“C:\Windows”)是%SystemRoot%,因此您可以使用“%SystemRoot%\System32\ cmd.exe”。 - Eryk Sun

2
最初的回答:
如果您想尝试这个编码建议执行此任务...基本上,使用findstr检查变量%cmdcmdline%的值是否与.cmd或.bat匹配,如果返回正面,则转到:eof(退出),但是,如果没有,则运行您的代码...
  @echo off & cd /d %~dp0" 

  echo/%cmdcmdline% | findstr /i "\.cmd \.bat" 2>nul && ( 

    title... by click.. & echo/%cmdcmdline% | findstr "%0" 

    echo/ bat: "%0" running by click

    timeout /t 5 /nobreak>nul & goto :eof

    ) || (

    title... by command line.. && echo/%cmdcmdline%| findstr "%0" 

    echo/ bat: "%0" running by command line 

    timeout /t 5 /nobreak>nul & goto :run_code

   )

  :run_code

  echo/ your code enter here

  ::  ....

  goto :eof

1st by click & 2nd by command line


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接