1

У меня есть файлы, подобные этому в текущем каталоге:

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

000252.png → 000254.png
000254.png → 000256.png
000256.png → 000258.png

Другими словами, это конечный результат, который я хотел бы получить:

Как мне использовать PowerShell для реализации этого?

2 ответа2

5

Короткий ответ

Предполагая, что рабочий каталог содержит все файлы для переименования (и только эти файлы), вот одна строка для их переименования:

dir . | sort -des | % { if ($_.BaseName % 2 -eq 0 ) { mv $_ $((2 + $_.BaseName).ToString("000000") + $_.Extension) } }

объяснение

  • dir . перечисляет файлы в текущем каталоге (.). dir - это псевдоним Get-ChildItem.
  • sort -des сортирует эти файлы в порядке убывания (-des) их имен. sort - это псевдоним Sort-Object, а -des - сокращение -Descending .
  • % - это псевдоним ForEach-Object, который выполняет сценарий (заключенный в фигурные скобки ({}) для каждого элемента в конвейере.
  • if ($_.BaseName % 2 -eq 0 ) используется для проверки того, содержит ли базовое имя четное число с использованием операторов равенства (-eq) и модуля (%).
  • mv - это псевдоним Move-Item, который можно использовать для переименования файла.
  • $_ это текущий элемент в конвейере.
  • (2 + $_.BaseName) извлекает базовое имя и добавляет 2.
  • .ToString("000000") форматирует этот новый номер с ведущими нулями (при условии, что вам нужно всего шесть цифр).
  • + $_.Extension добавляет исходное расширение файла ($_.Extension - это расширение текущего файла в конвейере, которое включает в себя .)

замечание

Это решение будет переименовывать файл с именем 000998.png в 001000.png (другими словами, оно гарантирует, что всего будет 6 цифр).

2
$files = "C:\files"

# for each file in the directory
# sort descending. this avoids trying to rename 252 -> 254 since 254 may exist.
gci $files | sort -des | % {
    $b = $_.BaseName                    # full basename, eg 000252
    $int = $b / 1                       # cast as an int, eg 252

    # if the integer is even
    if($int % 2 -eq 0) {

        # increase the name by 2
        $newBaseName = $b -replace $int,''
        $int = $int + 2

        # prepare the new basename
        $newBaseName = $newBaseName + [string]$int + $_.Extension

        # rename the files
        rename-item $files\$_ $files\$newBaseName -WhatIf
    }
}

Удалите -WhatIf после того, как вы убедитесь, что это работает правильно.

Вы не указали это как требование, поэтому я не учел это, но знаю, что файл с именем «000998.png» будет переименован в «0001000.png», а не «001000.png».

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