Коротка відповідь
Для відображення назв 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
будь-де у назві каталогу (шляху)