1

Я использую Windows 10.

У меня есть много папок с одинаковыми именами (предположим, имя "data") в разных подкаталогах базового каталога (здесь «d:\dir»).

Как я могу удалить содержимое (содержащее только файлы) всех папок с именем "data", не удаляя себя?

Например, для трех папок:

d:\dir\data
d:\dir\tmp1\data
d:\dir\tmp3\tmp2\data

3 ответа3

1

Следуя вашему примеру, вам нужно позвонить:

Get-ChildItem -Recurse d:\dir | Where-Object { ($_.DirectoryName) -and (Split-Path $_.DirectoryName -Leaf) -eq 'data' } | Remove-Item
1

В пределах Windows , окно командной строки следующую командную строку можно использовать для удаления только все файлы (не папки) во всех каталогах data D:\dir и его подкаталогах:

for /F "delims=" %I in ('dir "D:\dir\*data" /AD /B /S 2^>nul ^| findstr /E /I /C:"\data"') do @del /A /F /Q "%I\*"

Эта же командная строка будет записана в командном файле Windows следующим образом:

@echo off
for /F "delims=" %%I in ('dir "D:\dir\*data" /AD /B /S 2^>nul ^| %SystemRoot%\System32\findstr.exe /E /I /C:"\data"') do del /A /F /Q "%%I\*"

Команда FOR выполняется в отдельном командном процессе, запущенном с %ComSpec% /C в фоновом режиме командной строки:

dir "D:\dir\*data" /AD /B /S 2>nul | C:\Windows\System32\findstr.exe /I /E /C:"\data"

Переменная среды ComSpec обычно определяется как %SystemRoot%\System32\cmd.exe как это видно при просмотре системных переменных среды в Панели управления Windows - Система - Дополнительные параметры системы - Переменные среды .... Переменная среды SystemRoot определяется по умолчанию с путем к каталогу Windows. Другими словами, FOR выполняется по умолчанию на большинстве ПК с Windows C:\Windows\System32.exe с параметром /C и командной строкой, указанной между (' и ') . См. Также статью в Википедии со списком предопределенных переменных среды Windows .

Команда DIR выводит для обработки STDOUT (стандартный вывод)

  • в голом формате из-за опции /B
  • просто имена каталогов из-за опции /AD (атрибут directory)
  • с полным путем из-за опции /S
  • соответствие шаблону подстановки *data
  • в указанном каталоге D:\dir
  • и все его подкаталоги также из-за опции /S

DIR будет выводить сообщение об ошибке для обработки STDERR (стандартная ошибка) при отсутствии записи каталога, соответствующей этим критериям. Это сообщение об ошибке подавляется путем перенаправления его на устройство NUL с 2>nul .

Таким образом, вывод DIR для данного примера:

D:\dir\data
D:\dir\tmp1\data
D:\dir\tmp3\tmp2\data

Выход DIR для обработки STDOUT перенаправляется с помощью | обрабатывать STDIN (стандартный ввод) следующей команды FINDSTR.

FINDSTR ищет в потоке, прочитанном из STDIN , построчно

  • без учета регистра из-за опции /I
  • буквально интерпретируемая строка \data
  • который должен быть найден в конце строки из-за опции /E

Итак, FINDSTR выводит для обработки STDOUT фоновой команды, обрабатывая все строки с \data в конце строки, что снова для данного примера:

D:\dir\data
D:\dir\tmp1\data
D:\dir\tmp3\tmp2\data

Фильтрация вывода команды DIR с помощью FINDSTR необходима для исключения каталога с именем, подобным MyData который также выводится DIR из-за подстановочного знака * который требуется для получения не всех подкаталогов D:\dir\data и его подкаталогов, но всех каталоги data в D:\dir и его подкаталогах.

Прочитайте статью Microsoft об использовании операторов переадресации команд, чтобы получить объяснения 2>nul и | , Операторы перенаправления > и | необходимо экранировать с помощью символа « ^ в командной строке FOR, чтобы интерпретировать его как буквенные символы, когда интерпретатор команд Windows обрабатывает эту командную строку перед выполнением команды FOR, которая выполняет встроенную командную строку dir в отдельном командном процессе, запущенном в фоновом режиме.

FOR с параметром /F захватывает все выходные данные, наконец, для обработки STDOUT запущенного командного процесса и обрабатывает этот вывод построчно после завершения запущенного cmd.exe .

FOR всегда игнорирует пустые строки, но DIR и FINDSTR не выводят пустых строк.

FOR по умолчанию игнорирует также все строки, начинающиеся с ; который является символом конца строки по умолчанию. Но все строки, захваченные FOR, в этом случае не начинаются с точки с запятой, потому что все строки начинаются с D: Так что по умолчанию eol=; можно сохранить. В противном случае eol=| обычно лучше всего подходит для обработки списка имен файлов / папок, поскольку ни одно имя файла / папки не может содержать вертикальную черту.

FOR по умолчанию разделяет каждую строку на подстроки с использованием обычного пробела и символа горизонтальной табуляции в качестве разделителей строк и назначает только первую строку, разделенную пробелом / табуляцией, указанной переменной цикла I Имя папки в пути к каталогу data может содержать символ пробела. По этой причине пустой список разделителей задается с помощью delims= что отключает поведение разбиения строк, в результате чего присваивается переменная цикла I всегда полное имя найденной папки data .

FOR выполняет для каждого каталога data назначенного I команду:

del /A /F /Q "%I\*"

Перед выполнением DEL %I заменяется полным именем каталога, назначенным в настоящий момент переменной I цикла.

Команда DEL предназначена для удаления файлов. Не удаляет каталоги. Параметр /A используется для удаления всех файлов независимо от их атрибутов, включая файлы со скрытым набором атрибутов, которые DEL не будет удалять без параметра /A Параметр /F необходим для принудительного удаления файла с набором атрибутов только для чтения, который не будет удален без параметра /F Параметр /Q используется для подавления запроса, запрашивающего пользователя, действительно ли все файлы, соответствующие * должны быть удалены с помощью DEL.

Полное имя каталога должно быть заключено в двойные кавычки, поскольку оно может содержать пробел или один из этих символов &()[]{}^=;!'+,`~ который требует использования " вокруг строки аргумента команды, как объяснено с помощью CMD на последней странице справки, которая выводится при запуске в окне командной строки cmd /?

Обратите внимание, что DEL не может удалять файлы, для которых у пользователя нет разрешения NTFS на удаление файлов или которые в настоящее время открываются приложением, таким образом, чтобы предотвратить удаление файла во время открытия приложением. DEL выводит сообщение об ошибке для каждого файла, который нельзя удалить из-за отсутствия NTFS или прав доступа к файлу.

Чтобы понять используемые команды и то, как они работают, откройте окно командной строки, выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.

  • del /?
  • dir /?
  • echo /?
  • findstr /?
  • for /?
1

Рекурсивно перечислите все папки с именем "data", затем удалите их содержимое.

$base_dir = 'D:\dir'
$name     = 'data'

Get-ChildItem $base_dir -Recurse -Force | Where-Object {
    $_.PSIsContainer -and
    $_.Name -eq $name
} | Select-Object -Expand FullName | ForEach-Object {
    Remove-Item "$_\*" -Recurse -Force
}

В PowerShell v3 и новее вы можете заменить условие фильтра $_.PSIsContainer с помощью параметра -Directory с Get-ChildItem .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .