Как преобразовать содержимое переменной в строку?
У меня есть 5 переменных и у меня есть 3 файла.
$NumOne = Read-Host 'Enter four digit numone'
$NumTwo = Read-Host = 'Enter two digit numtwo'
$sdataJRN= $NumOne + $NumTwo + "00" + ".jrn"
$sdataJNM = $NumOne + $NumTwo + "00" + ".jnm"
$sdataTXN = $NumOne + $NumTwo + "00" + ".txn"
Прямо сейчас три файла - 06540200.jnm и jrn и txn соответственно.
Я хочу переименовать каждый из этих файлов. Вместо того, чтобы быть 00 в конце, я хочу 99. 06540299 JRN JNM TXN
Я делаю это со следующими строками:
Rename-Item $sdataJRN -NewName $NumOne,$NumTwo,"99",".jrn"
Rename-Item $sdataJNM -NewName $NumOne,$NumTwo,"99",".jnm"
Rename-Item $sdataTXN -NewName $NumOne,$NumTwo,"99",".txn"
Это возвращает ошибку.
Rename-Item: Невозможно преобразовать 'System.Object[]' в тип "System.String", требуемый параметром "NewName". Указанный метод не поддерживается. В строке:1 символ:34 + Rename-Item $sdataJRN[0] -NewName <<<< $storeNum,$regNum,"99",". Jrn" + CategoryInfo: InvalidArgument: (:) [Rename-Item], ParameterBindingException + FullyQualifiedErrorId: CannotConvertArgument,Microsoft.PowerShell.Commands.RenameItemCommand
2 ответа
То, что вы ищете, это блок сценария с задержкой привязки, который позволяет вам получить значение параметра из каждого входного объекта:
Примечание. Как и в вашем коде, предполагается, что входные файлы находятся в текущем каталоге.
$sdataJRN, $sdataJNM, $sdataTXN |
Rename-Item -NewName { $_ -replace '00\.([^.]+)$', '99.$1' }
{ ... }
является блоком скрипта с задержкой привязки, который оценивается для каждого входного объекта, и внутри него автоматическая переменная$_
относится к входному объекту под рукой.
-replace
Оператор оперирует регулярными выражениями:
00\.([^.]+)$
Матчи00
перед буквальным.
(\.
), а затем один или несколько символов, которые не являются буквальными.
([^.]
) в конце строки ($
).Включая
[^.]+
в(...)
совпадение - в данном случае расширение имени файла - захватывается, так что на него можно ссылаться в операнде замены как$1
первая (и только в этом случае) группа захвата.Замена операнда
99.$1
затем заменяет все, что регулярное выражение соответствует буквальному99.
с последующим значением$1
значение первой группы захвата, т. е. расширение имени входного файла.
Что касается того, что вы пытались:
Rename-Item $sdataJRN -NewName $NumOne,$NumTwo,"99",".jrn"
$NumOne,$NumTwo,"99",".jrn"
не является операцией конкатенации строк, она создает 4-элементный массив, благодаря использованию ,
, Оператор построения массивов PowerShell.
Так как -NewName
оператор [string]
-typed - то есть, единственная строка, пытающаяся передать массив, терпит неудачу.
Для конкретного входного имени вы могли бы использовать расширяемую строку, чтобы синтезировать -NewName
аргумент:
Rename-Item $sdataJRN -NewName "${NumOne}${NumTwo}99.jrn"
Тем не менее, вышеуказанное решение с задержкой привязки обеспечивает большую гибкость.
Попробуйте код ниже, чтобы переименовать элементы:
Rename-Item $sdataJRN -NewName ($NumOne + $NumTwo + "99" + ".jrn")
Rename-Item $sdataJNM -NewName ($NumOne + $NumTwo + "99" + ".jnm")
Rename-Item $sdataTXN -NewName ($NumOne + $NumTwo + "99" + ".txn")