Вопрос или проблема
Я выполняю обслуживание нескольких виртуальных машин с Windows 10. Одна из задач – очистить папки пользователя/временные. Я обнаружил, что могу использовать
for /F "tokens=*" %a in ('dir /ad/b') do cmd /c del /s/f/q "%a\AppData\Local\Temp\*.*"
для этого, но это оставляет директории и подпапки. Чтобы удалить их, я обнаружил, что могу использовать
for /D %f in (*) do rmdir %f /s /q
находясь в директории пользователя/временной, но я не нашел способа автоматизировать это для прохода по всем пользовательским директориям. Это возможно?
Не знаю, что попробовать.
Это можно использовать в пакетном файле:
for /F "eol=| delims=" %%I in ('dir C:\Users /AD-L /B 2^>NUL') do pushd "C:\Users\%%I\AppData\Local\Temp" 2>NUL && (rd /Q /S "C:\Users\%%I\AppData\Local\Temp" 2>NUL & popd)
Команда DIR выполняется cmd.exe
при обработке пакетного файла в фоновом режиме:
%ComSpec% /c dir C:\Users /AD-L /B 2>NUL
Переменная окружения system ComSpec
устанавливается по умолчанию в Windows как %SystemRoot%\system32\cmd.exe
, которая разворачивается в C:\WINDOWS\system32\cmd.exe
.
Команда DIR выводит в STDOUT фонового процесса командной строки
- все имена директорий в
C:\Users
, которые не являются ссылками, такими какAll Users
илиDefault User
, из-за/AD-L
(атрибут директории, а не ссылка) - в простом формате, что означает только имена директорий без пути благодаря опции
/B
.
Прочтите документацию Microsoft о Использовании операторов перенаправления команд для объяснения 2>NUL
. Оператор перенаправления >
должен быть экранирован символом каретки ^
в строке команды FOR внутри '
, чтобы быть интерпретированным как буквальный символ, когда Командный процессор Windows обрабатывает пакетный файл, парсит эту строку команды перед выполнением команды FOR, которая выполняет встроенную строку команды dir
с помощью отдельного процесса команды, запущенного в фоновом режиме.
Командный процессор Windows в процессе обработки пакетного файла захватывает список имён директорий без пути, написанных в STDOUT фонового процесса команды.
Список имен директорий обрабатывается построчно следующей строкой с помощью FOR на cmd.exe
, запущенном в фоновом режиме, который закрывает себя после завершения выполнения команды dir
.
Пустые строки всегда игнорируются FOR, которых здесь нет. Все остальные строки по умолчанию разбиваются на подстроки, используя обычный пробел и горизонтальную табуляцию в качестве разделителей строк. Если первая строка, разделенная пробелами/табулами, начинается с точки с запятой после удаления всех начальных пробелов/табуляции, строка полностью игнорируется по умолчанию для дальнейшей обработки. Это поведение обработки строки здесь не нужно. Имена директорий могут содержать один или несколько пробелов, и они могут даже начинаться с одного или нескольких пробелов, а потом с точки с запятой или начинаться с просто точки с запятой. Здесь указаны опции FOR /F eol=|
и delims=
, чтобы переопределить символ конца строки на вертикальную черту вместо точки с запятой, так как ни одно имя директории не может никогда содержать вертикальную черту, и определить пустой список разделителей, чтобы отключить поведение разбиения строк и удаление начальных пробелов. Каждое имя директории, выводимое dir
, присваивается, следовательно, как есть, указанной переменной цикла I
.
Дальнейшая обработка объясняется в полном объёме в моем ответе на: Как удалить файлы/подкаталоги в определенной директории в командной строке Windows?
- Директория
Temp
пользователя становится текущей рабочей директорией дляcmd.exe
, обрабатывающего пакетный файл, если она вообще существует. Это предотвращает удаление самой директорииTemp
. Ничего другого не происходит, если в пользовательской директории нет подкаталогаAppData\Local\Temp
, что возможно, так как пользователь может переопределить переменные окружения userTEMP
иTMP
и удалять затемTemp
вAppData\Local
. - Директория
Temp
удаляется с помощью команды RD тихо со всеми подкаталогами. Удаление этой директории, по крайней мере, для директорииTemp
самой не удается, поскольку она является текущей рабочей директориейcmd.exe
, обрабатывающего пакетный файл. Оно также может не удаться для файлов, которые в данный момент открыты другими работающими процессами и подкаталогами для файлов, открытых другими процессами в этих директориях, или другие процессы используют подкаталог в качестве текущей рабочей директории. Тем не менее, команда RD удаляет как можно больше файлов и подкаталогов, включая те, которые имеют скрытый или только для чтения атрибут. - Исходная рабочая директория восстанавливается с помощью команды POPD.
Выполнение этого пакетного файла следует производить только после перезагрузки Windows или виртуальной машины, так как ранее выполненная установка могла привести к тому, что файлы существуют в %TEMP%
или в одном из его подкаталогов, которые будут перемещены во время перезагрузки Windows в другую директорию для завершения установки с использованием ожидающей операции переименования для замены файлов, которые в данный момент используются во время установки, и поэтому заменять их напрямую невозможно. Удаление всех файлов и подкаталогов в директории %TEMP%
учетной записи пользователя может привести к повреждению установки, если сделать это до необходимой перезагрузки Windows для завершения установки.
Чтобы понять использованные команды и как они работают, откройте окно командной строки, выполните там следующие команды и изучите отображаемые справочные страницы для каждой команды полностью и внимательно.
dir /?
for /?
popd /?
pushd /?
rd /?
Смотрите также одинарная строка с несколькими командами, используя пакетный файл Windows для объяснения условного оператора команд &&
и безусловного оператора команд &
.
Ответ или решение
Чтобы выполнить очистку временных папок пользователей в Windows 10 с помощью команды rmdir
в цикле FOR
, можно использовать пакетный файл, который будет обходить все пользовательские каталоги и удалять содержимое соответствующих директорий. Ниже представлен полный пример того, как это можно реализовать.
Пакетный файл для удаления временных папок
Создайте новый текстовый файл с расширением .bat
, например, ClearTemp.bat
, и вставьте в него следующий код:
@echo off
REM Переходим в директорию пользователей
cd C:\Users
REM Определяем цикл для всех директорий в C:\Users
for /F "eol=| delims=" %%I in ('dir /AD-L /B 2^>NUL') do (
REM Переходим в папку Temp текущего пользователя
pushd "C:\Users\%%I\AppData\Local\Temp" 2> NUL && (
REM Если папка Temp существует, удаляем её содержимое
rd /S /Q "C:\Users\%%I\AppData\Local\Temp" 2> NUL
popd
)
)
Объяснение работы скрипта
-
Ключевые команды:
@echo off
— отключает вывод команд в окне командной строки для аккуратности.cd C:\Users
— смена директории на корень каталога пользователей.
-
Цикл
FOR
:for /F "eol=| delims=" %%I in ('dir /AD-L /B 2^>NUL') do (...)
— выполняем командуdir
для получения всех папок (пользователей), кроме ссылок, в формате, где выводится только имя папки.eol=|
— игнорируем строки, начинающиеся с символа "|".delims=
— отключаем делимитеры для возможности обработки полных имен директорий.
-
Переход в папку Temp:
pushd
— перемещение в директорию Temp конкретного пользователя. Если директория не существует,2> NUL
подавляет сообщение об ошибке.
-
Удаление содержимого:
rd /S /Q "C:\Users\%%I\AppData\Local\Temp"
— удаление папки Temp и всех её содержимостей без запроса на подтверждение (/Q
), включая подкаталоги (/S
).
-
Возврат в предыдущую директорию:
popd
— возвращение в предыдущее состояние каталога после выполнения команды.
Запуск скрипта
- Сохраните файл с указанным кодом.
- Запустите командную строку от имени администратора.
- Перейдите в директорию, где находится ваш файл
ClearTemp.bat
. - Введите
ClearTemp.bat
и нажмите Enter для выполнения скрипта.
Важные замечания
- Перед выполнением скрипта рекомендуется перезагрузить систему, чтобы убедиться, что нет процессов, использующих файлы в папках Temp, что может привести к ошибкам при удалении.
- Убедитесь, что у вас есть права администратора, так как может потребоваться доступ к некоторым каталогам.
- Внимательно следите за ошибками в консоле и проверьте, что скрипт работает как ожидается до его применения на реальных данных.
Пользуясь данным подходом, вы можете эффективно управлять содержимым временных каталогов в среде Windows.