【发布时间】:2018-11-05 15:54:15
【问题描述】:
我正在尝试执行以下操作,但删除包含批处理文件的下载文件夹失败: 注意:所有 exe、应用程序、批处理文件等都包含在 file.zip 中。
- 用户将file.zip下载到任意目录并解压。
- 用户运行位于解压缩文件夹中的 exe。
- 这又会运行两个便携式应用程序和其他一些东西。
- 一旦履行职责,我远程进入并运行相同的 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 分钟。我不确定如何解决这个问题。无论如何,其中一些系统进程不能被杀死,也可能不应该被杀死。正如我在下面的评论中提到的,杀死/重新启动资源管理器似乎也会使删除该文件夹失败。有谁知道为什么?
-
我更新了上面的代码以反映最新的编辑。感谢您指出
null和nul。
标签: windows batch-file command delete-file kill-process