我有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
答案 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