【问题标题】:Batch file delete itself, delete folder, and restart computer?批处理文件删除自己,删除文件夹,然后重新启动计算机?
【发布时间】:2015-08-09 20:30:08
【问题描述】:

我在这里看到了部分问题的答案,但没有一个能涵盖所有问题。如有遗漏,敬请见谅。

这就是我所拥有的:一个调用其他批处理文件的批处理文件,最后删除这些文件,然后重新启动计算机。我将它用于我设置的新机器上的某些配置。现在,我必须选择多个文件,将它们放到新桌面上,然后在那里运行。

我修改了批处理以从我放置在桌面上的单个目录中运行它们,并在完成后删除了该文件夹,但它失去了重新启动的能力。这是最后 3 行:

cd C:\Users\XXXX\Desktop
RD /S /Q "C:\Users\XXXX\Desktop\YYYYYYYYY"
shutdown -r
(del %0)

执行此操作的最佳方法是什么?我是否创建了一个新的批处理文件,除了上面的最后 3 个操作之外什么都不做(我列出了第一个,因为我假设我必须先离开目录才能删除它)?如果是这样,真的只需要这三行吗?就像第一个动作运行是将有问题的文件复制到桌面,然后在更改目录后将其作为最后一个动作执行?

对不起,如果我把这篇文章写得太罗嗦了,只是想提供尽可能多的细节。

【问题讨论】:

  • 那么这个批处理文件在 C:\Users\XXXX\Desktop\YYYYYYYYY 中吗?如果是,则永远不会读取最后两行以执行。此外,当您发出 shutdown -r 时,它可能会终止 cmd 会话,因此它不会到达脚本中的最后一个命令,因此请使用 shutdown /t:5 给它 5 秒的时间来完成(1 或 2 可能是够了,不过)。
  • @TonyHinkle 你的评论应该是一个答案
  • @TonyHinkle,我目前所做的是复制我在上面发布的“清理”文件,然后“RD”命令是删除其他所有内容所在的主文件夹。所以它将上面的文件复制到桌面,运行主批处理文件,退出目录,删除目录,给出关闭命令,然后删除自己。我希望这是有道理的......

标签: batch-file restart


【解决方案1】:

批处理文件是逐行读取和执行的,因此您不能以这种方式执行该代码。但是,代码块(括号中的几行)首先被读取/解析,然后整个代码块被执行,所以你的问题的解决方案是这样的:

(
cd C:\Users\XXXX\Desktop
RD /S /Q "C:\Users\XXXX\Desktop\YYYYYYYYY"
del "%~F0"
shutdown -r
)

当然,当 cmd.exe 尝试读取 下一行 并且批处理文件不再存在时,此方法会产生错误消息,但该消息在这种情况下无关紧要。

【讨论】:

【解决方案2】:

批处理文件是逐行读取的,因此如果在脚本完成之前删除批处理文件,它将无法读取下一行。您可以使用以下脚本轻松演示这一点:

@echo off 
echo Beginning
del %0.bat
echo End

从命令提示符运行脚本,您会看到它从不回显“End”并给您一个错误“找不到批处理文件”。因此,如果您的批处理文件位于您要删除的目录中,则需要将其移至其他位置,或者如您所说,创建一个不同的批处理脚本。

其次,我在测试中发现您必须将 .bat 扩展名添加到 %0 上,如上面的脚本所示,它才能删除文件。

最后,如果您发出关闭系统的命令,它将开始杀死进程,您的 cmd 会话就是其中之一。因此,您需要使用shutdown /t:5 /r 来延迟它,以便您的脚本有几秒钟的时间来完成。

【讨论】: