Пакетный файл, который удаляет себя и папку, которая его содержит - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь сделать следующее, но удалить загруженную папку, содержащую пакетный файл, не удается: ПРИМЕЧАНИЕ. Все исполняемые файлы, приложения, командный файл и т. Д. Содержатся в файле file.zip.

  1. Пользователь загружает файл .zip в любой каталог и распаковывает.
  2. Пользователь запускает исполняемый файл, который находится в разархивированной папке.
  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?

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Хорошо ... Я ДУМАЮ Я понял, как сделать то, что я хочу, пытаясь удалить файл 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
0 голосов
/ 05 ноября 2018

По ссылке с 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%"

Позаботьтесь, чтобы папка, содержащая пакет, была удалена
включая любые другие файлы / папки без каких-либо дополнительных вопросов!

...