2016-11-03 3 views
0

У меня есть часть программного обеспечения, которая ищет файлы с именем «report.txt». Тем не менее, текстовые файлы не все называются report.txt, и у меня есть сотни подпапок для прохождения.Переименовать элемент в нескольких подпапках

Сценарий:

J:\Logs 
26-09-16\log.txt 
27-09-16\report270916.txt 
28-09-16\report902916.txt 

Я хочу искать через все подпапки для файлов *.txt в J:\logs и переименовать их в report.txt.

Я попытался это, но он жаловался на пути:

Get-ChildItem * | 
Where-Object { !$_.PSIsContainer } | 
Rename-Item -NewName { $_.name -replace '_$.txt ','report.txt' } 

ответ

1

Get-ChildItem * получит ваш текущий путь, так что в вместо давайте использовать определить путь, который вы хотите Get-ChildItem -Path "J:\Logs" и добавить recurse, потому что мы хотим, чтобы файлы во всех вложенные папки.

Тогда давайте добавим использовать параметр Get-ChildIteminclude и file, а не Where-Object

Тогда, если труба, что ForEach, мы можем использовать Rename-Item на каждом объекте, где объект переименования будет $_ и NewName будет report.txt.

Get-ChildItem -Path "J:\Logs" -include "*.txt" -file -recurse | ForEach {Rename-Item -Path $_ -NewName "report.txt"} 

Мы можем урезать это немного вниз в один-лайнер моды с парой псевдонимами и полагаться на позиции, а не перечисляя каждый параметр

gci "J:\Logs" -include "*.txt" -file -recurse | % {ren $_ "report.txt"} 
+0

Спасибо, это именно то, что я хотел. :) – Andy