Как преобразовать содержимое переменной в строку? - PullRequest
0 голосов
/ 06 февраля 2019

У меня 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 : Cannot convert 'System.Object[]' to the type 'System.String' required by parameter 'NewName'. Specified method is not supported.
At line:1 char:34
+ Rename-Item $sdataJRN[0] -NewName <<<<  $storeNum,$regNum,"99",".jrn"
    + CategoryInfo          : InvalidArgument: (:) [Rename-Item], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.RenameItemCommand

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Попробуйте следующий код для переименования элементов:

Rename-Item $sdataJRN -NewName ($NumOne + $NumTwo + "99" + ".jrn")

Rename-Item $sdataJNM -NewName ($NumOne + $NumTwo + "99" + ".jnm")

Rename-Item $sdataTXN -NewName ($NumOne + $NumTwo + "99" + ".txn")
0 голосов
/ 06 февраля 2019

То, что вы ищете, это блок сценария с задержкой привязки , который позволяет вам получить значение параметра из каждого входного объекта:

Примечание. Как и в вашем коде,Предполагается, что входные файлы находятся в текущем каталоге.

$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"

Тем не менее, приведенное выше решение с задержкой привязки обеспечивает большую гибкость.

...