【问题标题】:Prevent inadvertent batch file run防止无意的批处理文件运行
【发布时间】:2020-11-14 14:56:48
【问题描述】:

为了防止无意的run of batch files 在某些文件夹中产生不良行为,我将这 3 行添加到所有批处理文件的开头。

@echo off
set /p choice=Are you sure to run this file, if so press 'y' anything else cancels? 
if /I %choice% neq y notepad %~f0
.
. rest of the code
.

因此,如果用户按下y,文件将执行预期操作,否则notepad 将打开它进行编辑,例如单击.ps1 文件,但控制台窗口保持打开状态,直到我关闭记事本或关闭控制台,读取this post 表明我所做的并不理想。

记事本打开文件后有没有办法关闭控制台。

【问题讨论】:

  • 使用choice 命令肯定更好(参见 Compo 的分析器)。但是为了解释你的问题:%choice% 是空的。你定义了%choice %。使用set 命令删除= 周围的空格。
  • 你是对的,我在这里只是为了可读性而忘记了它的重要性。我认为这与不使用start 有关

标签: windows batch-file


【解决方案1】:

最简单的方法是使用内置的choice.exe 实用程序、Start 命令,当然还有Exit 命令。 (+)

@%SystemRoot%\System32\choice.exe /M "Are you sure to run this file"
@If ErrorLevel 2 Start %SystemRoot%\System32\notepad.exe "%~f0" & Exit
@Echo Off
.
. rest of the code
.

[编辑/]

这是一种替代方法,正如我在下面的评论中提到的那样。

@%SystemRoot%\System32\choice.exe /C YN /N /D N /T 5 /M "Are you sure to run this file"
@If ErrorLevel 2 Start %SystemRoot%\System32\notepad.exe "%~f0" & Exit
@Echo Off
.
. rest of the code
.

我建议您使用choice.exe 的原因是Set /P 命令具有潜在危险。有了它,最终用户可以随意输入任何内容,包括故意的恶意字符或命令。因此,您的代码需要在不运行它的情况下稳健地解析该输入,以免破坏您的脚本,或更糟。

这是使用Set /P 执行类似功能的方法示例。

@Set "#="& Set /P "=Are you sure to run this file? If so, press 'y', anything else cancels"<Nul
@For /F Skip^=1^ Delims^=^ EOL^= %%# In ('%SystemRoot%\System32\replace.exe ? . /U /W') Do @If Not Defined # Set "#=%%#"
@(Set #) 2> NUL | %SystemRoot%\System32\findstr.exe /ILX "#=Y" 1> NUL || (
    Start %SystemRoot%\System32\notepad.exe "%~f0"& Exit)
@Echo Off
.
. rest of the code
.

【讨论】:

  • 请注意,您也可以使用%SystemRoot%\notepad.exe,作为始终可在 32 位 cmd.exe 会话中访问的版本,并且如果您确定环境没有被意外或其他方式修改,只使用choice 代替%SystemRoot%\System32\choice.exe,只使用notepad,代替%SystemRoot%\System32\notepad.exe%SystemRoot%\notepad.exe
  • choice 很好,但它只允许[Y/N],我真的在寻找任何其他取消
  • 这在技术上是不正确的,因为不同的语言使用不同的键,它们不都是英文的。也没有必要这样做,因为最终用户只能输入两个键,[CTRL]+[C] 除外)。如果您的最终用户无法遵循简单的提示,则不能信任他们使用您的脚本。如果在定义的时间跨度内未按下Y,则一种可能的更好方法是使用默认选项N。这样,只有Y 将继续脚本。我在上面的答案中添加了[EDIT /] 这样的替代方法。
  • 你是对的,但我从MS-DOS 中的unformat 命令中得到了启发,它曾经写过这个,并且一些可能使用该脚本的计算机仍然在过时的操作系统上.
  • @user10191234,我添加了一个示例来显示使用Set /P 时的区别。如果您真的认为有必要这样做,请随意尝试。
猜你喜欢
  • 2018-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 2019-05-21
  • 2015-05-12
相关资源
最近更新 更多