在 PowerShell 4.0 中用文件名重命名文件夹

Renaming folder with filename in PowerShell 4.0

我有很多文件夹想要使用 PowerShell 批量重命名。在每个文件夹中,都有许多具有不同扩展名的不同文件。我想要做的是用 *.nfo 文件名重命名文件夹。

示例:

C:\foldertest\TEST\ 在此文件夹中,这些文件位于:
JPG.jpg
NFO.nfo
TXT.txt
WAV.wav

在 运行 一个脚本之后,我希望将文件夹重命名为 *.nfo:
C:\foldertest\NFO\
我需要一个同时适用于 > 1 个文件夹的解决方案。

这是我的(不工作o/c):
Get-ChildItem -Path "C:\foldertest\" | Where-Object{$_.PSisContainer} | ForEach-Object -Process { $new1Name = Get-ChildItem $_ -Filter "*.nfo" | Select-Object -ExpandProperty BaseName Rename-Item -Path $_.FullName -NewName ($_.Name -replace $new1Name }

更新: 我仍然有问题。该解决方案(见下文)起初似乎有效,但只是有时有效。假设有 30% 的文件夹。然后这个错误发生在其余部分:
Rename-Item : Cannot rename because item at 'C:\Users\STOFFES\Desktop\REN\blablablabla' does not exi st. At C:\Users\STOFFES\Desktop\REN\REN.ps1:2 char:3 + Rename-Item (Split-Path $_ -Parent) ($_.BaseName) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [Rename-Item], PSInvalidOperationException + FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.RenameItemCommand

尽管大多数文件夹中都有 *.nfo 文件。

也许是这样的?

Get-ChildItem *.nfo -File -Recurse | ForEach-Object {
  Rename-Item (Split-Path $_ -Parent) ([IO.Path]::GetFileNameWithoutExtension($_.Name)) -WhatIf
}

由于 -File 参数,需要 PowerShell 3+。准备好后删除 -WhatIf

(旁白:在 PowerShell 3.0 及更高版本中不再需要命令中的 Where-Object 过滤器,因为它具有 -File-Directory 参数。)

Get-ChildItem -Path "E:\Test\Rename" -Include "*.nfo" -Recurse | 
ForEach-Object {
    $oldFolder = $_.DirectoryName

    # New Folder Name is .nfo Filename, excluding extension
    $newFolder = $_.Name.Substring(0, $_.Name.Length - 4)

    # Verify Not Already Same Name
    if ($_.BaseName.ToUpper() -ne $newFolder.ToUpper()) {
        Write-Host "Rename: $oldFolder To: $newFolder"

        Rename-Item -NewName $newFolder -Path $oldFolder
    }
}

你有多层子文件夹吗?这很可能是您收到 'Cannot rename because item does not exist' 错误的原因,因为您已经重命名了父文件夹。如果是这样,您将需要更复杂的东西。