如何将变量的内容转换为字符串?

时间:2019-02-06 00:45:59

标签: powershell rename-item-cmdlet

我有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"

现在三个文件分别是06540​​200.jnm和jrn和txn。

我想重命名每个文件。而不是最后要00,我想要99。06540​​299 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 :(得分:0)

您正在寻找的是delay-bind script block,它使您可以从每个输入对象派生参数值:

注意:与您的代码一样,假设是输入文件位于当前目录中。

$sdataJRN, $sdataJNM, $sdataTXN |
  Rename-Item -NewName { $_ -replace '00\.([^.]+)$', '99.$1' }

{ ... }是一个延迟绑定的 script块,它针对每个输入对象进行评估,并且在其中自动变量$_指的是输入对象。

-replace运算符对正则表达式(正则表达式)进行操作:

  • 00\.([^.]+)$在文字00.)之前匹配\.,然后是一个或多个不是文字.的字符( [^.]放在字符串($)的末尾。

  • 通过将[^.]+括在(...)中,将捕获匹配-在这种情况下为文件名扩展名-以便可以在替换操作数中将其引用为$1,即 1st (仅在这种情况下)捕获组

  • 替换操作数99.$1然后替换与文字99.匹配的正则表达式,然后替换$1的值,即第一个捕获组的值,即输入文件名扩展名。


关于您尝试过的事情

  

Rename-Item $sdataJRN -NewName $NumOne,$NumTwo,"99",".jrn"

$NumOne,$NumTwo,"99",".jrn"不是字符串连接操作,由于使用了PowerShell的数组构造运算符,,它创建了一个 4元素数组

由于-NewName运算符是[string]类型的-即单个字符串,因此尝试传递 array 失败。

对于特定的输入名称,您可以使用可扩展的字符串来合成-NewName参数:

Rename-Item $sdataJRN -NewName "${NumOne}${NumTwo}99.jrn"

也就是说,上述延迟绑定解决方案提供了更大的灵活性。

答案 1 :(得分:0)

请尝试以下代码来重命名项目:

keyup