PowerShell移动和重命名文件

3
我需要交换一些文件的名称。这些文件在同一个位置,因此我计划将它们移动到一个临时区域,避免出现两个名称相同的文件。我尝试根据名称参数来识别文件,将其移动到临时区域并重新命名。
我想使用类似以下内容的方法:
Get-ChildItem ".\" -Recurse | Where-Object { $_.Name -like "*XYZ*"} | Move-Item -Force -Destination "C:\new\" | Rename-Item -NewName { $_.Name -replace 'XYZ','ABC' }

文件移动了,但没有重命名。我不能把 move-item 管道传输到 rename-item 吗?
我很想知道有没有更好的方法可以交换两个文件的文件名而不移动它们,同时也想知道为什么上述方法不能正常工作。
谢谢!
2个回答

7

默认情况下,Move-Item 不会沿着管道传递当前对象。

您可以使用 -Passthru 选项来获取该功能:

Move-Item -Force -Destination "C:\new\" -Passthru

或者,您可以通过将Move-item的目标设为文件来省略Rename-Item

Get-ChildItem ".\" -Recurse |
    Where-Object { $_.Name -like "*XYZ*"} |
    Move-Item -Force -Destination "C:\new\$($_.Name -replace 'XYZ','ABC')"

我可以安全地假设,每当我收到一个错误,声称 cmdlet 无法沿管道传递对象时,-passthru 都能正常工作吗? - Garrett
1
说实话我不确定 - 它经常被使用,但不能肯定地说所有Cmdlets都使用了它。找出最好的方法 - 以 Move-Item 为例 - 是在 PowerShell 中使用 help Move-Item 或者在 MSDN文档 中查看。 - G42

0

交换意味着两个重命名,只能使用一个临时位置或临时名称进行。

在我看来,一个临时名称更容易。

#Requires -Version 3.0
(Get-ChildItem ".\*XYZ*" -File -Recurse) | ForEach-Object {
    $Swap = $_.Replace("XYZ","ABC")
    If (Test-Path $Swap){
      Rename-Item $Swap -NewName "$Swap.bak"
      $_ | Rename-Item -NewName $Swap
      Rename-Item "$Swap.bak" -NewName $_.FullName
    } else {
      $_ | Rename-Item -NewName $Swap
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接