Короткий ответ
Чтобы вывести на экран имена файлов PDF, которые прямо или косвенно содержатся в прямом или косвенном подкаталоге d:\root
именных purchases
, вы можете использовать:
gci -Directory -Recurse d:\root\purchases | % { gci -Recurse "$_\*.pdf" } | % FullName
Краткое объяснение: команда рекурсивно находит все прямые и непрямые подкаталоги d:\root
именованных purchases
, затем рекурсивно находит все файлы PDF в каждом из этих подкаталогов, а затем возвращает полный путь к каждому из этих файлов PDF.
Другие варианты использования
Чтобы удалить эти файлы PDF:
gci -Directory -Recurse d:\root\purchases | % { gci -Recurse "$_\*.pdf" } | ri
Чтобы переименовать эти PDF-файлы (например, добавив префикс и суффикс к базовому имени):
gci -Directory -Recurse d:\root\purchases | % { gci -Recurse "$_\*.pdf" } | % { rni $_ "pref-$($_.BaseName)-suff.pdf" }
Чтобы удалить каталоги purchases
вместе со всем их содержимым:
gci -Directory -Recurse d:\root\purchases | ri -Recurse
Детальное объяснение
gci
- это псевдоним Get-ChildItem.
gci -Directory -Recurse d:\root\purchases
возвращает все каталоги (-Directory
), чьи имена являются purchases
которые являются прямыми или косвенными (-Recurse
) вложенными папками в d:\root\
. Другими словами, он будет возвращать d:\root\purchases
(если он существует), а также d:\root\b\c\purchases
и d:\root\a\purchases
. Это не очень интуитивно понятно и, по-видимому, не объясняется в документации, но это текущее поведение (в PowerShell 6).
%
является псевдонимом ForEach-Object. Он выполняет блок скрипта (заключенный в фигурные скобки ({}
) для каждого объекта в конвейере.
gci -Recurse "$_\*.pdf"
извлекает список файлов PDF, которые (прямо или косвенно) содержатся в ранее найденных каталогах purchases
.
% FullName
просто используется для отображения пути к этим файлам PDF.
ri
является псевдонимом для Remove-Item. Он удаляет ранее вычисленный список файлов PDF (поскольку параметр -Path
команды Remove-Item
принимает входные данные конвейера).
ri -Recurse
позволяет удалить ранее рассчитанный список каталогов purchases
вместе с их содержимым.
rni $_ "pref-$($_.BaseName)-suff.pdf"
добавляет префикс (pref-
) и суффикс (-suff
) к базовому имени $_.BaseName
текущего файла в конвейере (т.е. каждый из файлов PDF, которые мы ищем). Базовое имя файла - это имя файла без его расширения, а rni
- псевдоним для Rename-Item.
Тестирование этого решения (онлайн или локально)
Самое простое - попробовать это решение онлайн.
В противном случае вы можете создать образец структуры каталогов в test
папке текущего рабочего каталога со следующим фрагментом (будьте осторожны: измените .\test
на что-то другое, если у вас уже есть test
папка в текущем каталоге):
mkdir -ErrorAction SilentlyContinue .\test\a\purchases, .\test\a\e\, .\test\b\c\purchases\
Out-File .\test\a\purchases\invoice1.pdf
Out-File .\test\a\order1.pdf
Out-File .\test\a\e\order2.pdf
Out-File .\test\b\c\purchases\invoice2.pdf
Out-File .\test\b\c\purchases\invoice3.pdf
Чтобы просмотреть все файлы в этой структуре каталогов, вы можете использовать:
gci -Recurse -File .\test | % FullName
Что бы вернуть что-то вроде:
D:\test\a\order1.pdf
D:\test\a\e\order2.pdf
D:\test\a\purchases\prefix-invoice1-suffix.pdf
D:\test\b\c\purchases\prefix-invoice2-suffix.pdf
D:\test\b\c\purchases\prefix-invoice3-suffix.pdf
(Где D:
заменяется вашим текущим рабочим каталогом.)
Выполнение команды, предоставленной в качестве ответа (gci -Directory -Recurse .\test\purchases | % { gci -Recurse "$_\*.pdf" } | % FullName
), отобразит файлы, которые необходимо удалить или удалить:
D:\test\a\purchases\invoice1.pdf
D:\test\b\c\purchases\invoice2.pdf
D:\test\b\c\purchases\invoice3.pdf
Чтобы очистить после вашего теста:
rm -Recurse .\test