Использование rmdir в цикле FOR для удаления подпапок в user/appdata/local/temp.

Вопрос или проблема

Я выполняю обслуживание нескольких виртуальных машин с 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?

  1. Директория Temp пользователя становится текущей рабочей директорией для cmd.exe, обрабатывающего пакетный файл, если она вообще существует. Это предотвращает удаление самой директории Temp. Ничего другого не происходит, если в пользовательской директории нет подкаталога AppData\Local\Temp, что возможно, так как пользователь может переопределить переменные окружения user TEMP и TMP и удалять затем Temp в AppData\Local.
  2. Директория Temp удаляется с помощью команды RD тихо со всеми подкаталогами. Удаление этой директории, по крайней мере, для директории Temp самой не удается, поскольку она является текущей рабочей директорией cmd.exe, обрабатывающего пакетный файл. Оно также может не удаться для файлов, которые в данный момент открыты другими работающими процессами и подкаталогами для файлов, открытых другими процессами в этих директориях, или другие процессы используют подкаталог в качестве текущей рабочей директории. Тем не менее, команда RD удаляет как можно больше файлов и подкаталогов, включая те, которые имеют скрытый или только для чтения атрибут.
  3. Исходная рабочая директория восстанавливается с помощью команды 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
    )
)

Объяснение работы скрипта

  1. Ключевые команды:

    • @echo off — отключает вывод команд в окне командной строки для аккуратности.
    • cd C:\Users — смена директории на корень каталога пользователей.
  2. Цикл FOR:

    • for /F "eol=| delims=" %%I in ('dir /AD-L /B 2^>NUL') do (...) — выполняем команду dir для получения всех папок (пользователей), кроме ссылок, в формате, где выводится только имя папки.
    • eol=| — игнорируем строки, начинающиеся с символа "|".
    • delims= — отключаем делимитеры для возможности обработки полных имен директорий.
  3. Переход в папку Temp:

    • pushd — перемещение в директорию Temp конкретного пользователя. Если директория не существует, 2> NUL подавляет сообщение об ошибке.
  4. Удаление содержимого:

    • rd /S /Q "C:\Users\%%I\AppData\Local\Temp" — удаление папки Temp и всех её содержимостей без запроса на подтверждение (/Q), включая подкаталоги (/S).
  5. Возврат в предыдущую директорию:

    • popd — возвращение в предыдущее состояние каталога после выполнения команды.

Запуск скрипта

  1. Сохраните файл с указанным кодом.
  2. Запустите командную строку от имени администратора.
  3. Перейдите в директорию, где находится ваш файл ClearTemp.bat.
  4. Введите ClearTemp.bat и нажмите Enter для выполнения скрипта.

Важные замечания

  • Перед выполнением скрипта рекомендуется перезагрузить систему, чтобы убедиться, что нет процессов, использующих файлы в папках Temp, что может привести к ошибкам при удалении.
  • Убедитесь, что у вас есть права администратора, так как может потребоваться доступ к некоторым каталогам.
  • Внимательно следите за ошибками в консоле и проверьте, что скрипт работает как ожидается до его применения на реальных данных.

Пользуясь данным подходом, вы можете эффективно управлять содержимым временных каталогов в среде Windows.

Оцените материал
Добавить комментарий

Капча загружается...