То, что вы ищете, это блок сценария с задержкой привязки , который позволяет вам получить значение параметра из каждого входного объекта:
Примечание. Как и в вашем коде,Предполагается, что входные файлы находятся в текущем каталоге.
$sdataJRN, $sdataJNM, $sdataTXN |
Rename-Item -NewName { $_ -replace '00\.([^.]+)$', '99.$1' }
{ ... }
- это задержка привязки блок сценария , который оценивается для каждого входного объекта и внутри него автоматическая переменная $_
относится к входному объекту под рукой.
Оператор -replace
работает с регулярными выражениями:
00\.([^.]+)$
соответствует 00
перед литералом .
(\.
), за которым следует еще один или несколько символов, которые не являются литеральными .
([^.]
) в конце строки ($
).
Путем включения [^.]+
в (...)
совпадение - в данном случае расширение имени файла - захватывается, так что на него можно ссылаться в операнде замены как $1
,то есть 1-й (и только в этом случае) группа захвата .
RОператор eplacement 99.$1
затем заменяет все совпадения регулярного выражения на литерал 99.
, за которым следует значение $1
, т. е. значение 1-й группы захвата, т. е. расширение входного имени файла.
Что касается то, что вы пытались :
Rename-Item $sdataJRN -NewName $NumOne,$NumTwo,"99",".jrn"
$NumOne,$NumTwo,"99",".jrn"
не является конкатенацией строкОперация создает массив из 4 элементов , благодаря использованию ,
, оператора построения массива PowerShell.
Поскольку оператор -NewName
имеет тип [string]
, то есть, одиночная строка , попытка передать массив не удалась.
Для конкретного входного имени вы могли бы использовать расширяемую строку для синтезааргумент -NewName
:
Rename-Item $sdataJRN -NewName "${NumOne}${NumTwo}99.jrn"
Тем не менее, приведенное выше решение с задержкой привязки обеспечивает большую гибкость.