У меня есть имена файлов, содержащие 2 - х.

  • Перед первым текст всегда одинаков (daughter of moon).

  • После первого - (за которым следует пробел, а перед - это также пробел) обычно указывается какое-то число (но также может быть текст).

  • После второго - похоже.

Я хочу разделить мое имя файла на 3. part1 - part2 - part3.jpg .

Я хотел бы иметь скрипт, который перемещает part3 в part2 (= переключить части).

Позже я хочу иметь возможность переключать некоторые части part2 и part1 .

Я пробовал такие вещи, как

get-childItem 'daugther of moon - * - 2*.jpg' | rename-item -newname ` { $_.name -replace ($x.split('moon -')[0], $x.split(' - ^ - ')[1], $x.split('- 2')[2], $x.split('.')[3] -join)} 

но это, кажется, не работает.

Что я делаю неправильно?

3 ответа3

0

При выполнении более сложных операций легче следовать, если вы сломаете его.

$files = Get-ChildItem 'daugther of moon - * - 2*.jpg'

$files | ForEach-Object {
    $parts = $_.BaseName.Split("-")
    $partOne = $parts[0].Trim()
    $partTwo = $parts[1].Trim()
    $partThree = $parts[2].Trim()

    Rename-Item $_ -NewName "$partOne - $partThree - $partTwo$($_.Extension)"
}
0

Следующий скрипт использует RegEx для создания groups () из элементов, разделенных на - и переупорядочивает их для создания нового имени

# Change path to fit your environment
Pushd "A:\"
Get-ChildItem 'daugther of moon - * - *.jpg' |
  Where BaseName -match '(daugther of moon) - (.*) - (.*)'|
    Rename-Item -NewName {$matches[1]+' - '+`
                          $matches[3]+' - '+`
                          $matches[2]+$_.Extension} -Confirm
PopD

Поскольку Rename-Item принимает входные данные по конвейеру, блок сценария {} собирает элементы в новом порядке.

Пример вывода на мой A:\ ramdrive

Confirm
Are you sure you want to perform this action?
Performing the operation "Rename File" on target 
      "Item: A:\daugther of moon - one - two.jpg 
Destination: A:\daugther of moon - two - one.jpg".
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"):
0

Утилита Bulk Rename (http://www.bulkrenameutility.co.uk/Main_Intro.php, Freeware) может делать то, что вы ищете, и даже больше, хотя я понимаю, что это не ответ на ваш вопрос относительно того, что вы делаете неправильно PowerShell ... (Я бы использовал его функциональность RegEx для достижения вашей цели)

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