1

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

这将返回一个错误。

重命名项目:无法将“System.Object []”转换为参数“NewName”所需的类型“System.String”。不支持指定的方法。
在行:1 字符:34
+ 重命名项目 $sdataJRN[0] -NewName <<<< $storeNum,$regNum,"99",".jrn"
    + CategoryInfo : InvalidArgument: (:) [Rename-Item], ParameterBindingException
    +fullyQualifiedErrorId:CannotConvertArgument,Microsoft.PowerShell.Commands.RenameItemCommand
4

2 回答 2

0

您正在寻找的是一个延迟绑定脚本块,它允许您从每个输入对象派生一个参数值:

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

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

{ ... }是为每个输入对象评估的延迟绑定脚本块,其中自动变量指的是手头的输入对象。$_

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

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

  • 通过包含[^.]+在 中(...),匹配(在这种情况下为文件扩展名)被捕获,以便它可以在替换操作数中作为 引用$1,即第一个(并且仅在这种情况下)捕获组

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


至于你尝试了什么:

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

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

由于-NewName运算符是[string]-typed - 即单个 string,因此尝试传递数组失败。

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

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

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

于 2019-02-06T02:10:05.703 回答
0

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

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

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

Rename-Item $sdataTXN -NewName ($NumOne + $NumTwo + "99" + ".txn")
于 2019-02-06T09:32:49.360 回答