Коротка відповідь
Для відображення назв 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).
% є псевдонімом для Длякожного об'єкта . Він виконує блок сценаріїв (укладений у фігурні фігурні дужки ( {} ) для кожного об'єкта в трубопроводі.
gci -Recurse "$_\*.pdf" отримує список PDF-файлів, які (прямо чи опосередковано) містяться в раніше знайдених файлах purchases каталоги.
% FullName використовується для відображення шляху цих файлів PDF.
ri є псевдонімом для Видалити-елемент . Він видаляє раніше обчислений список PDF-файлів (оскільки -Path параметр Remove-Item команда приймає вхід трубопроводу).
ri -Recurse дозволяє видалити попередньо обчислений список purchases каталоги разом зі своїм вмістом.
rni $_ "pref-$($_.BaseName)-suff.pdf" додає префікс ( pref- ) і суфікс ( -suff ) до базової назви $_.BaseName поточного файлу в конвеєрі (тобто кожного з файлів PDF, які ми шукаємо). Базовою назвою файлу є ім'я файлу без його розширення і rni є псевдонімом для Перейменувати-елемент .
Тестування цього рішення (онлайн або локально)
Найпростіше спробуйте це рішення в Інтернеті .
В іншому випадку можна створити зразкову структуру каталогів в a test папки поточного робочого каталогу , з наступним фрагментом ( будь обережний : change .\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
gciдзвінки, як пропонують інші відповіді, можна просто зробити це:gci C:\Root *.pdf -Recurse | ? DirectoryName -imatch 'purchase'це поверне тільки PDF-файли, які мають рядокpurchaseбудь-де у назві каталогу (шляху)