Проблема в том, что первая строка не запускает явно cmd.exe
с опцией /C
для повторного запуска пакетного файла с помощью отдельного командного процесса с минимизированным окном.
@echo off
if defined IS_MINIMIZED goto ClearFolders
set "IS_MINIMIZED=1"
start "Clear Folders" /min %ComSpec% /C "%~f0" %*
goto :EOF
:ClearFolders
call :Clear_Folder "%SystemRoot%\TEMP"
if defined TEMP call :Clear_Folder "%TEMP%"
for /D %%k in (C:\Users\*) do if exist "%%k\AppData\Local\Temp" call :Clear_Folder "%%k\AppData\Local\Temp"
goto :EOF
:Clear_Folder
pushd "%~1"
if errorlevel 1 goto :EOF
rd /Q /S "%~1" 2>nul
popd
goto :EOF
См. Также мой ответ на Как удалить файлы / подпапки в определенном каталоге из командной строки в Windows? Это объясняет, почему rd /Q /S "%~1" 2>nul
достаточно для удаления всех подпапок и файлов в каталоге, путь которого передаетсяс аргументом 1 для подпрограммы Clear_Folder
, если этот каталог действительно существует и pushd
успешно сделал его текущим каталогом для командного процесса, обрабатывающего пакетный файл.
См. также: Где находится GOTO:EOF return to?
Что происходит после выполнения первого goto :EOF
, зависит от того, как был запущен этот пакетный файл и в какой среде.
Двойной щелчок по пакетному файлу приводит кзапуск командного процессора Windows cmd.exe
для обработки командного файла с использованием неявной опции /C
to close comПроцесс мандата после выполнения командного файла. В этом случае первый goto :EOF
приводит к закрытию первоначально открытого окна консоли, так как командный процесс Windows, обрабатывающий пакетный файл, первоначально также закрывается.
Первое открытие командной строки окна приводит к запуску cmd.exe
с использованием неявной опции от /K
до сохранить командный процесс, запущенный после выполнения командной строки, такой как выполнение этого пакетного файла. В этом случае окно консоли остается открытым после выполнения первого goto :EOF
, поскольку командный процесс продолжает выполняться для дальнейшего выполнения команды пользователем.
Первый goto :EOF
можно заменить командой exit
, чтобы всегда exit командный процесс, не зависящий от того, как cmd.exe
была начата первоначальная обработка командного файла, и не зависит от иерархии вызовов. Поэтому использование exit
не рекомендуется, если этот пакетный файл вызывается из другого пакетного файла, который выполняет, например, больше операций очистки жесткого диска.