Массовое переименование файлов в powershell и добавление счетчика к каждому имени файла - PullRequest
0 голосов
/ 09 апреля 2019

Я могу массово переименовать файлы в каталоге ИЛИ заменить каждое имя файла на счетчик, однако мне нужно объединить оба.

Массовое переименование (оставить первые 2 символа исходного имени):

Get-ChildItem * |  
    Rename-Item -NewName { $_.BaseName.Split('-')[0] + $_.Extension }

(частично жестко закодированное решение, я знаю!)

В качестве альтернативы добавьте счетчик:

$count = 1
Get-ChildItem * | % { Rename-Item $_ -NewName (‘{0}.xlsx’ -f $count++) }

(я даже не мечтаю о конце 0 с)

Я пытался объединить обе вещи, но безрезультатно.Что я делаю не так?

Моя неудачная попытка:

$count = 1 
Get-ChildItem * |
    Rename-Item -NewName { $_.BaseName.Split('-')[0] -f $count++ + $_.Extension }

Ответы [ 2 ]

1 голос
/ 09 апреля 2019

Вы не понимаете, как работает оператор формата .Вам нужна строка формата с заполнителем ({0}), чтобы этот оператор работал.Я бы также порекомендовал поместить скобки вокруг этого выражения, хотя в этом случае это не требуется.Просто чтобы быть в безопасности.

('foo {0} bar' -f $some_var) + $other_var

С учетом сказанного вы, очевидно, хотите добавить значение переменной счетчика к фрагменту из исходного имени файла, а не использовать этот фрагмент в качестве строки формата.Для этого вы можете просто объединить счетчик с фрагментом, как вы делаете это с расширением.

Чтобы счетчик работал правильно, вам также необходимо указать правильную область действия.То, как вы его используете, определяет новую переменную $counter в локальной области видимости блока скриптов каждый раз, когда файл переименовывается, поэтому переменная $counter в родительской области действия никогда не увеличивается.Используйте модификатор области script: или global:, чтобы получить переменную, которую вы на самом деле намереваетесь использовать.

$count = 1
Get-ChildItem * |
    Rename-Item -NewName { $_.BaseName.Split('-')[0] + $script:count++ + $_.Extension }

Если вы хотите использовать оператор форматирования вместо конкатенации строк (+), вы 'буду использовать это так:

$count = 1
Get-ChildItem * |
    Rename-Item -NewName { '{0}{1}{2}' -f $_.BaseName.Split('-')[0], $script:count++, $_.Extension }
0 голосов
/ 09 апреля 2019

Чтобы подсчитать $ count, вы должны выполнить цикл.

$count = 1 
Get-ChildItem * | foreach-object { Rename-Item -NewName { $_.BaseName.Split('-')[0] -f 
 count++ + $_.Extension } }

% - это псевдоним командлета foreach-object, который вы использовали в подходе "add count".Просто добавил это к вашей неудачной попытке.

...