Как переименовать файлы с последовательными четными и нечетными номерами в PowerShell?

Я хотел бы знать, как я могу переименовать файлы из определенной папки с последовательностью только четных и нечетных чисел в PowerShell. Например. Папка1: pag_001.jpg, pag_003.jpg, pag_005.jpg.... pag_201.jpg , Папка2: pag_002.jpg, pag_004.jpg, pag_006.jpg.... pag_200.jpg. Это потому, что у меня есть документ, в котором сначала были отсканированы страницы шансов, а затем четные страницы, поэтому их имена файлов находятся в последовательной последовательности от 1 до 201. Затем я разделил половину файлов, которые являются страницами шансов, в новый место: Folder1, а вторая половина,четные страницы в Folder2. Вот почему я хотел бы сначала изменить имена и снова присоединиться к их новым именам.

Я пробовал это на основе подобного сообщения:

На данный момент я мог генерировать четные числовые последовательности следующим образом:

ForEach ($number in 1..100 ) { $number * 2}

и такие нечетные числа:

ForEach ($number in 0..100 ) { $number *2+1}

и хотел применить сгенерированные ранее последовательности, чтобы переименовать мои файлы следующим образом:

cd C:\test\Folder1
$i = $number * 2
Get-ChildItem *.jpg | %{Rename-Item $_ -NewName ('pag_{0:D3}.jpg' -f $i++)}

но это не работает! Любые предложения приветствуются

С уважением,


person Darwin PC    schedule 16.11.2015    source источник


Ответы (2)


Ваш $i++ добавляет 1 каждый раз, поэтому он также добавляет четные числа,

Вы можете создать массив нечетных чисел, а затем использовать $i++ для перехода к одному элементу в массиве, например:

$path = "C:\test\Folder1"
$oddNumbersArray = 0..100 | % {$_ *2 +1}
$i = 0
Get-ChildItem $path -Filter *.jpg | % {Rename-Item $_ -NewName ("pag_$($oddNumbersArray[$i]).jpg") ;$i++}

Для четных чисел измените строку $oddNumbersArray на {$_ *2}.

person Avshalom    schedule 16.11.2015
comment
использование оператора -f внутри выражения немного неоднозначно, поскольку вы фактически не заменяете никакие заполнители в строке. Почему бы просто не перенести $i++ за пределы операции Rename-Item? - person Mathias R. Jessen; 16.11.2015

Куча способов сделать это. Для меня мы добавляем каждый индекс в качестве члена, чтобы он был более легко доступен в блоке сценария переименования элемента.

$index = 0 

Get-ChildItem $path -Filter "*.jpg" | ForEach-Object{
    $index = $index +2
    $_ | Add-Member -Name "Index" -MemberType NoteProperty -Value $index -PassThru
} | Rename-Item -NewName {'pag_{0:D3}.jpg' -f $_.Index} -WhatIf 

Используя Add-Member в ForEach-Object, мы обновляем значение индекса, а затем добавляем его как свойство с тем же именем. Затем в вашем блоке сценария rename-item мы можем вызвать это свойство. Удалите -WhatIf после того, как вы убедились, что новые имена вам нужны. Переключите $index между 0 и -1 для четного и нечетного соответственно.


Другой метод, использующий глобальную индексную переменную и уменьшающий конвейер с помощью вычисляемых свойств для создания переменных конвейера, которые использует Rename-Item.

$path = "C:\Temp\csv"
$global:index = 0 # Use -1 for odd

Get-ChildItem $path -Filter "*.csv" | 
    Select-Object @{Name="Path";Expression={$_.FullName}},
        @{Name="NewName";Expression={$global:index = $global:index + 2; 'pag_{0:D3}.jpg' -f $global:index}} | 
    Rename-Item  -WhatIf
person Matt    schedule 16.11.2015
comment
Мне плохо, потому что я знаю, что это может быть более многословно, чем это. Так что попробую обновить. - person Matt; 16.11.2015