【问题标题】:How do I make a batch file delete it's own directory?如何让批处理文件删除它自己的目录?
【发布时间】:2016-11-16 04:35:08
【问题描述】:

好的,我很抱歉我对此很陌生,但我试图让我的批处理文件在它启动后删除它自己的目录。这是我的文件夹的排列方式:

  • 文件夹 1
    • delete.bat

我的目标是在“delete.bat”启动后让“delete.bat”删除“Folder1”。所以这是我的代码:

rd /s /q %~dp0..\Folder1

这似乎可行,但它只会删除“Folder1”的内容,而不是整个目录本身。我做错了什么?

【问题讨论】:

  • rmdir /s /q %~dp0..\Folder1
  • rd /s /q %~dp0 %~dp0 是批处理所在的文件夹路径。

标签: windows batch-file command-line command-prompt


【解决方案1】:

一些想法...

  • %~dp0 获取批处理文件的驱动器和路径,因此您不需要包含..\Folder1
  • 您所拥有的应该可以工作。如果它没有删除文件夹本身,则表示它已被锁定,可能是因为cmd的当前文件夹是Folder1。 (这可能是一种猜测,但这不是它可能被锁定的唯一原因。)如果是 cmd,则必须从 Folder1 之外的另一个文件夹调用批处理文件。
  • 虽然您所拥有的将起作用,但在恢复不存在的批处理文件时会导致一个有趣的错误:系统找不到指定的路径。您可以在下面的解决方案中避免这种情况。

一个很好的解决方案:start /b "" cmd /c rd /s /q "%~dp0"

这会创建一个新进程来删除文件夹(以及其中的所有内容,包括批处理文件本身)。当心。 =)

【讨论】:

  • 您不必从不同的文件夹调用批处理。您可以在批处理脚本中 cd "%~dp0.. 以保证您的当前目录与 folder_1 不同。
  • 这个新字符串到底有什么作用?自从我尝试使用它以来,我一直在通常工作的进程上遇到一堆语法错误。我不确定这是否是原因,但如果是,是否有办法扭转它?
【解决方案2】:

来自对应的MSDN link for rd:

您不能使用 rmdir 删除当前目录。您必须先切换到不同的目录(不是当前目录的子目录),然后使用带有路径的 rmdir。

我猜这就是你的问题所在,因为批处理文件位于你要删除的目录中。

【讨论】:

    【解决方案3】:

    好吧,我认为它无法完成(至少作为普通用户)

        start /b "" cmd /c rd /s "%~dp0"
    

    删除文件夹,但我认为只有正确的权限

        start /b "" cmd /c rmdir /s "C:/folder"
    

    结果相同

        del /s /q "C:\Temp\folder\*"
        rmdir /s /q "C:\Temp\folder"
        del %0
    

    批处理文件的唯一方法是使用vbs脚本或自动热键(发送!{空格} //发送e //发送p公式)或破解它,您只能删除使用的文件和文件夹的内容,但不能删除工作目录由于 cmd 的规范。任何其他语言都没有问题,因为它在 RAM 内存中。

    我推荐这种方式(对于普通用户): 在你的 bat 文件中添加

        copy C:\urpath\deleteafter.bat C:\Temp\deleteafter.bat
        start "" autohotkey.exe "X:\patchto\deletebatchfile.ahk"
    
    
        deletebatchfile.ahk
        sleep 2000
        Run, C:\Temp\deleteafter.bat, C:\Temp\
        
        deleteafter.bat
        rmdir /s /q "C:\Temp\batfileworkingpath"
        sleep 3
        del %0
    

    【讨论】:

      【解决方案4】:

      我的实现实际上与Soja's 相同,加上来自dbenham's comment 的信息。我添加了 2 秒延迟,以确保没有时间问题,即使我认为 .bat 文件删除自身时的错误是无害的。

      @echo off
      
      :: Do the work
      ...your command here...
      
      :: In order to delete the current dir we are running from (and all subdirs), none of them can be the
      :: current working directory of any running process. Therefore, we are setting our own CWD to something
      :: else, so it will be inherited by the below cmd.exe.
      cd /d %temp%
      
      :: The countdown is there to allow this batch file to exit, so it can then be deleted safely.
      set DelayedSelfDeleteCommand="timeout /t 2 >NUL && rmdir /s /q "%~dp0""
      
      :: Start a separate process (without waiting for it), to execute the command
      start "" /b cmd.exe /C %DelayedSelfDeleteCommand%
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-22
        • 2013-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-06
        • 1970-01-01
        相关资源
        最近更新 更多