好的,我很抱歉我在这方面很新,但是我试图让我的批处理文件在启动后删除它自己的目录。这就是我的文件夹的排列方式:
我的目标是制作" delete.bat"删除" Folder1"在" delete.bat"之后已经推出。所以这是我的代码:
rd /s /q %~dp0..\Folder1
这似乎可行,但它只删除" Folder1"的内容。而不是整个目录本身。我做错了什么?
答案 0 :(得分:2)
一些想法......
%~dp0
获取批处理文件的驱动器和路径,因此您无需包含..\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%