Почему цикл For зацикливает увеличенное число несколько раз? - PullRequest
0 голосов
/ 26 апреля 2019

Хорошо, поэтому я пытаюсь создать скрипт, который просто переименовывает файлы в каталоге.

В Справочнике есть 2 папки, и в каждой папке есть несколько изображений.

Я использую recurse для просмотра всех их.

Моя цель - переименовать каждуюодин файл с увеличенным номером, но это не работает, вместо этого скрипт переименует файлы с именем номера (1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4 и т. Д.)

Кто-нибудь может помочь с этой проблемой?Любой ответ приветствуется.


Что работает:

Если я заменю то, что написано внутри блока скрипта, на:

echo $i

, оно будет увеличиваться без проблем(1, 2, 3, 4 и т. Д.)

это не работает:

$targetPath | Rename-Item -NewName {$_.Directory.Name + '_' + $I}

КОД, С КОТОРЫМ Я РАБОТАЮ:

cls

$targetPath = Get-ChildItem -File -path C:\Users\Alban\Pictures\Joshua32GBBackUp -Recurse

$numberOfFiles = Get-ChildItem -File -path C:\Users\Alban\Pictures\Joshua32GBBackUp -Recurse | Measure-Object | % {$_.count}



for($i = 1 ; $i -le $numberOfFiles ; $i++ ) {

  $targetPath | Rename-Item -NewName $i -WhatIf

}

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

Чтобы файлы могли использоваться после переименования,

  • сохранить расширение и, возможно, общий префикс.
  • Поскольку Rename-Item принимает ввод по каналу, никакой foreach не требуется
  • для упрощения сортировки я рекомендую использовать ведущие нули для счетчика

$Counter = 0
Get-ChildItem -File -path C:\Users\Alban\Pictures\Joshua32GBBackUp -Recurse|
    Rename-Item -NewName {'File_{0:D3}{1}' -f $Script:Counter++,$_.Extension} -WhatIf

Если вывод выглядит нормально, удалите трейлинг -WhatIf

0 голосов
/ 26 апреля 2019

Вам также нужно перебирать файлы как часть цикла for, например:

for($i = 0 ; $i -le $numberOfFiles ; $i++ ) {
   #use indexing to pick the nTh file from the list
  $targetPath[$i] | Rename-Item -NewName $i -WhatIf

}

Обратите внимание, что я сбросил ваши начальные настройки для $i до нуля, потому что PowerShell начинает индексы сноль.

Но я бы не стал делать это на производстве, многие люди находят логику цикла for слишком сложной для понимания.Было бы лучше перебирать файлы напрямую и переименовывать их таким образом, вот так.

#Set initial value to zero
$i = 0

ForEach ($file in $targetPath){
    $newName = "$($file.BaseName)_$i$($file.Extension)"
    Rename-Item -Path $file -NewName $newName -WhatIf
    $i++
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...