我有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
你正在寻找的是一个delay-bind script block,它允许你获得从每个输入对象的参数值:
注意:在你的代码中,假设是输入文件位于当前目录中。
$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]
类型的 - 即一个字符串,试图通过阵列失败。
对于特定的输入名字,你也可以使用一个可扩展的字符串合成-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")