【问题标题】:Batch file that deletes itself and folder that contains it删除自身的批处理文件和包含它的文件夹
【发布时间】:2018-11-05 15:54:15
【问题描述】:

我正在尝试执行以下操作,但删除包含批处理文件的下载文件夹失败: 注意:所有 exe、应用程序、批处理文件等都包含在 file.zip 中。

  1. 用户将file.zip下载到任意目录并解压。
  2. 用户运行位于解压缩文件夹中的 exe。
  3. 这又会运行两个便携式应用程序和其他一些东西。
  4. 一旦履行职责,我远程进入并运行相同的 exe,但这次我选择运行批处理文件(位于解压缩文件夹中)的选项,该文件启动 30 秒计时器,然后应该停止应用程序并删除文件.zip 和解压后的文件夹,包括批处理文件本身。

下面是批处理文件:

@echo off
mode con: cols=32 lines=7
color 4f
title 
echo         30 Second Delay
echo      Close window to abort
echo/
echo/
echo 0%%                         100%%
SET /P var= <NUL

set count=0
:loop
  PING -n 2 127.0.0.1 >NUL 2>&1
  call :printline _
  set /a count=count+1
  if %count%==30 goto finish
goto loop

:printline
 REM Print text passed to sub without a carriage return.
 REM Sets line variable in case %1 intereferes with redirect
 set line=%1
 set /p var=%line%<NUL
exit /b

:finish
cls
color 0f
title Finished
mode con: cols=80 lines=25
echo Do NOT close this window!
echo/
echo Killing processes...
echo/
echo/
echo/

taskkill /t /f /im app1mainprocess.exe >nul
timeout /t 5 >nul
taskkill /t /f /im app2mainprocess.exe >nul

timeout /t 5 >nul

echo Do NOT close this window!
echo/
rem echo Restarting Windows Explorer...

rem timeout /t 10 >nul

rem taskkill /f /im explorer.exe >nul

rem start explorer.exe

echo Do NOT close this window!
echo/
echo Deleteing files and folders...
echo/

rem timeout /t 10 >nul

Set "Folder2Del=%~dp0"
cd ..
IF EXIST "file.zip" DEL "file.zip" /s /q >nul

rem echo %scrptDir%

echo Do NOT close this window!
echo/
echo Still working...
timeout /t 10 >nul
rd %Folder2Del% /s /q
(goto) 2>Nul & RD /S /Q "%Folder2Del%" & exit

我遇到的问题是该文件夹永远不会被删除。我意识到我的代码不正确,但另一个原因是解压缩文件夹中的一个 dll 文件有时仍在被 dllhost.exe 进程使用。

我不确定添加终止 dllhost.exe 进程的行是否安全,但我的代码仍然无法工作,因为它删除批处理文件本身和文件夹的方式有问题包含它。

我需要编辑哪些行,杀死 dllhost.exe 是否安全?

【问题讨论】:

  • 您需要确保您只是杀死了由您的一个可执行进程调用的dllhost.exe 进程,如果您这样做了,我看不出您有任何理由结束调用过程后无法删除它。 或者,当您结束调用过程时,您可能想尝试使用 TaskKill 和它的 /T 选项?
  • 杀死每个应用程序的主进程似乎会杀死所有应用程序生成的进程,但某些系统进程仍会锁定属于其中一个应用程序的特定 dll。这就是为什么有时无法删除该文件夹的原因。 dll 保持锁定状态 5-10 分钟。我不确定如何解决这个问题。无论如何,其中一些系统进程不能被杀死,也可能不应该被杀死。正如我在下面的评论中提到的,杀死/重新启动资源管理器似乎也会使删除该文件夹失败。有谁知道为什么?
  • 我更新了上面的代码以反映最新的编辑。感谢您指出nullnul

标签: windows batch-file command delete-file kill-process


【解决方案1】:

根据dbenham的链接

这就是诀窍:

@Echo off
Echo Ref: "http://www.dostips.com/forum/viewtopic.php?f=3&t=6491"
Set "Folder2Del=%~dp0"
cd "%~d0"
pause
(goto) 2>Nul & RD /S /Q "%Folder2Del%"

注意删除包含批处理的文件夹
包括任何其他文件/文件夹,没有任何进一步的问题!

【讨论】:

  • @Mofi 如果您发现明显的拼写错误,请随时编辑。
  • 谢谢,但我已经尝试过了。它也不起作用。就像我上面的代码一样,文件夹和批处理文件中的所有内容都被删除,但文件夹仍然存在。
  • 以上批次证明了这个概念是可行的。似乎来自该文件夹的某些程序仍处于活动状态并阻止删除。
  • cd /D 可能是一个错误的决定,因为如果它位于不同的驱动器上,它不会更改该驱动器上的当前文件夹,因此请查看更改的批次。
  • 我需要删除文件夹和 zip 文件。这就是我使用cd .. 的原因。我想知道杀死和启动 explorer.exe 是否是问题的一部分。如果我REM 输出杀死/启动资源管理器的代码,则该文件夹有时会被删除。当它没有被删除时,这是因为即使在我使用 /T 选项杀死主应用程序进程之后,与其中一个应用程序关联的 dll 之一仍被 dllhost.exe 或其他进程保留。 dll 被保留 5-10 分钟。过了那个时间,文件夹就可以被删除了,因为dll不再被锁定...
【解决方案2】:

好的...我想我想出了如何通过尝试删除 dll 文件来做我想做的事,然后再尝试删除整个目录。下面的代码查找问题 dll 并尝试将其删除。如果它仍然存在,它将尝试每 30 秒删除一次文件,最长持续 15 分钟。一旦 dll 被删除,整个文件夹也将被删除。如果 15 分钟后 dll 无法删除,则文件夹中剩余的文件将被删除。

我还有一个小问题。如果我添加杀死/重新启动 Windows 资源管理器的代码,该文件夹不会被删除。 为什么以及是否有解决方法?

下面是最新的代码:

@echo off
mode con: cols=32 lines=7
color 4f
title 
echo         30 Second Delay
echo      Close window to abort
echo/
echo/
echo 0%%                         100%%
SET /P var= <NUL

set count=0
:loop
  PING -n 2 127.0.0.1 >NUL 2>&1
  call :printline _
  set /a count=count+1
  if %count%==30 goto finish
goto loop

:printline
 REM Print text passed to sub without a carriage return.
 REM Sets line variable in case %1 intereferes with redirect
 set line=%1
 set /p var=%line%<NUL
exit /b

:finish
cls
color 0f
title Uninstall
mode con: cols=80 lines=25
echo Do NOT close this window!
echo/
echo Killing processes...

tasklist /fi "imagename eq app1mainprocess.exe" |find ":" > nul
if errorlevel 1 taskkill /t /f /im "app1mainprocess.exe" > nul

tasklist /fi "imagename eq app2mainprocess.exe" |find ":" > nul
if errorlevel 1 taskkill /t /f /im "app2mainprocess.exe" > nul

timeout /t 5 >nul

rem echo Do NOT close this window!
rem echo/
rem echo Restarting Windows Explorer...

rem timeout /t 10 >nul

rem taskkill /f /im explorer.exe >nul

rem start explorer.exe
echo/
echo Deleteing file.zip if it exists...

timeout /t 5 >nul

Set "Folder2Del=%~dp0"
cd ..
IF EXIST "file.zip" DEL "file.zip" /s /q >nul

rem echo %Folder2Del%

rem Loops for 30 times in 30 second intervals (Total 15 minutes) to confirm deletion. Loop will exit after 30 loops and move on if dll cannot be deleted.
for /l %%i in (1,1,30) do (
del "%Folder2Del%name*.dll"
if not exist "%Folder2Del%name*.dll" goto Folder2Del
echo/
echo File locked! May take up to 15 minutes to delete.
echo Will stop trying 15 minutes after first attempt.
timeout /t 30 >nul
)

:Folder2Del
echo/
echo Attempting to delete the Connector folder and it's contents...
timeout /t 5 >nul
rd "%~dp0" /s /q & exit

【讨论】:

    猜你喜欢
    • 2012-11-11
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 2011-01-15
    相关资源
    最近更新 更多