Пакетное переименование всех файлов PNG в папках и подпапках

331
Rmuell01

Я пытаюсь переименовать все файлы PNG в нескольких подпапках. Смотрите ниже мое объяснение того, что я делаю:

What is currently in place: COMPANY SERVER1 (Random).png COMPANY2 SERVER32 (Random).png  What I want:  COMPANY SERVER1 Company - Server1 - (Date PNG Modified).png COMPANY2 SERVER32 Company2 - Server32 - (Date PNG Modified).png 

Как я могу сделать это? Часть, с которой у меня возникают проблемы, - это получение первого и второго имени каталога, а также измененной даты, которую я могу вставить в имя файла.

Текущий скрипт, который у меня есть ниже:

@echo off for /r %%D in (.) do ( for /f "delims=" %%F in ('dir /b /A:-D "%%D\*.png"') do ( echo ren "D:\FinalDir\%%F" "%%~nxD-VirtualBootTest-3-3-18.png" )) >> "D:\FinalDir\RenameCommands.txt"   FOR /R "D:\OriginalDir" %%i IN (*.png) DO COPY "%%i" "D:\FinalDir" 

Сейчас он собирает все файлы PNG во всех каталогах в папке, в которой создается пакетный файл, для переименования всех файлов, которые он копирует, в FinalDir. Конечный результат переименования будет выглядеть как SERVER1-VirtualBootTest-3-3-18.png. Я не могу понять, как сделать изменение даты с файлом и добавить, что каталог находится в двух каталогах над файлом.

0

1 ответ на вопрос

0
HeedfulCrayon

Так что этот скрипт должен сделать свое дело. Это относительно просто.

$files = Get-ChildItem $basePath -File -Filter *.png -Recurse foreach($file in $files){ $pathParts = $file.fullName.split('\') $dateMod = $file.LastWriteTime.ToString("MM-dd-yyyy") $first = $pathParts[-3] $second = $pathParts[-2] $file | Rename-Item -NewName "$first - $second - $dateMod.txt" } 

Вот разбивка по частям:

$files = Get-ChildItem $basePath -File -Filter *.png -Recurse 

Сначала он получает все файлы, начиная с базового пути (вам придется установить $basepathпеременную по вашему пути) рекурсивно до конца структуры.

foreach($file in $files){ $pathParts = $file.fullName.split('\') $dateMod = $file.LastWriteTime.ToString("MM-dd-yyyy") $first = $pathParts[-3] $second = $pathParts[-2] $file | Rename-Item -NewName "$first - $second - $dateMod.txt" } 

Тогда для каждого файла это:

  • Разбивает полное имя файла (путь и имя файла) на основе символа '\'.

    $pathParts = $file.fullName.split('\')

  • Получает доступ к lastWriteTime и форматирует его в нужный вам формат.

    $dateMod = $file.LastWriteTime.ToString("MM-dd-yyyy")

  • Для $firstи $secondпеременного он обращается к пути, который был разделен с правой стороны (-1 будет именем файла, -2 является родитель, -3 является родителем этого родителя и так далее).

    $first = $pathParts[-3]

    $second = $pathParts[-2]

  • Принимает всю собранную информацию и переименовывает файл в эти фрагменты собранной информации.

    $file | Rename-Item -NewName "$first - $second - $dateMod.txt"

Похожие вопросы