如何制作批处理文件删除它自己的目录?

时间:2016-11-16 04:35:09

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

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

  • Folder1中
    • delete.bat

我的目标是制作" delete.bat"删除" Folder1"在" delete.bat"之后已经推出。所以这是我的代码:

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

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

4 个答案:

答案 0 :(得分:2)

一些想法......

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

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

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

答案 1 :(得分:1)

从相应的MSDN link获取rd:

  

您无法使用rmdir删除当前目录。您必须先更改为其他目录(不是当前目录的子目录),然后将rmdir与路径一起使用。

我想这就是您的情况出了问题,因为批处理文件位于您尝试删除的目录中。

答案 2 :(得分:0)

好吧,我认为这是不可能完成的(至少对于普通用户而言)

    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脚本或autohotkey(发送!{Space} //发送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

答案 3 :(得分:0)

我的实现实际上与 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%