Заменить переименовываемый элемент powershell на переменные

Я пытаюсь использовать вывод Get-Childitem | Where-Object переименовать группу файлов, но вместо переименования с постоянным именем я хочу переименовать с группой переменных, и я использую оператор -replace чтобы найти, где в строке то, что я хочу изменить. Пример:

nane_01 -> name_23
name_02 -> name_24  they are not with the same final digit

это код, который я использую для теста:

$a = 0
$b = 1
$Na= 2
$Nb= 3
Get-Childitem | Where-Object {$_.name -match "_0[1-9]"} | rename-item -Newname { $_.name  -replace "_{0}{1}","_{2}{3}" -f $a++,$b++,$Na++,$Nb++ } -Whatif

Я не могу найти способ заставить инкрементную переменную работать с -replace оператор

1 ответ

Решение
  1. Укажите область действия переменных в явном виде, в противном случае локальная копия будет отбрасываться при каждом вызове блока сценария переименования.

  2. Поиск / замена строки -replace операторы являются отдельными параметрами, поэтому форматируйте их отдельно, используя круглые скобки вокруг каждого (в противном случае PowerShell попытается применить -f в $_.name).

$script:a = 0
$script:b = 1
$script:Na= 2
$script:Nb= 3

Get-Childitem | Where-Object {$_.name -match "_0[1-9]"} | rename-item -Newname {
    $_.name -replace ("_{0}{1}" -f $script:a++,$script:b++),
                     ("_{0}{1}" -f $script:Na++,$script:Nb++)
} -Whatif

Или просто используйте одну переменную:

$script:n = 0

Get-Childitem | Where-Object {$_.name -match "_0[1-9]"} | rename-item -Newname {
    $_.name -replace ("_{0}{1}" -f $script:n++,$script:n++),
                     ("_{0}{1}" -f $script:n++,$script:n++)
} -Whatif
Другие вопросы по тегам