Как преобразовать содержимое переменной в строку?

У меня есть 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")
Другие вопросы по тегам