重命名项Powershell

时间:2014-03-07 05:13:12

标签: powershell powershell-v2.0

Invoke-Command -ComputerName comp1,comp2 -ScriptBlock {Get-ChildItem F:\sktest\*.txt | ForEach-Object{
$a=$_.fullname
$b=$a.Substring(0,($a.Length-4))+"_old.txt" | %{
   Rename-Item -path $a -NewName $b}
}}

使用上面的代码重命名文件(例如abc.txt到abc_old.txt)时,powershell会抛出“无法将参数绑定到参数'NewName',因为它是null。”错误。

当我在最后一个管道之前打印$ a和$ b的结果时,结果会按预期结束。但是最后它的rename-item cmdlet失败了。请让我理解我在这里做的错误。

2 个答案:

答案 0 :(得分:0)

你不需要第二个foreach区块。 (删除-whatif以有效地重命名文件)

Get-ChildItem c:\temp\*.txt | ForEach-Object{
    $a=$_.fullname
    $b=$a.Substring(0,($a.Length-4))+"_old.txt" 
    Rename-Item -path $a -NewName $b -whatif
}

答案 1 :(得分:0)

如上所述,还有一个额外的ForEach。我建议不要尝试将命令塞入一行。保持输入对象(对象而不是将其更改为字符串)时,行$ b也更具可重现性。基本上,如果C:\ SomeWorkingDir \ MyFile.LongExtension是他重命名的目标,代码就会中断。以下说明了前面提到的这些项目。

$Path = C:\SomeWorkingDir
Get-ChildItem $Path |
ForEach-Object {
    $a = $_.fullname
    $b = $_.BaseName + "_old.txt"
    Rename-Item -path $a -NewName $b
} # end foreach. Also end Get-ChildItem