Я пытаюсь переименовать все файлы 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. Я не могу понять, как сделать изменение даты с файлом и добавить, что каталог находится в двух каталогах над файлом.

1 ответ1

0

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

$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"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .