【问题标题】:Renaming folder with filename in PowerShell 4.0在 PowerShell 4.0 中使用文件名重命名文件夹
【发布时间】:2018-02-07 11:11:51
【问题描述】:

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

例子:

C:\文件夹测试\测试\ 这些文件位于此文件夹中:
JPG.jpg
NFO.nfo
TXT.txt
WAV.wav

运行脚本后,我希望将文件夹重命名为 *.nfo:
C:\文件夹测试\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 文件。

【问题讨论】:

    标签: powershell renaming


    【解决方案1】:

    也许是这样的?

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

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

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

    【讨论】:

    • Path.GetFileNameWithoutExtension() 不是必须的,$_.BaseName 就足够了
    • 为什么不简单地使用($_.BaseName) 而不是([IO.Path]::GetFileNameWithoutExtension($_.Name))
    • 嗨,请看我更新的帖子。我遇到了一些文件夹未重命名的问题。
    • 对不起,我再次测试,无法重现。
    【解决方案2】:
    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
        }
    }
    

    您是否有多个级别的子文件夹?这很可能是您收到“无法重命名,因为项目不存在”错误的原因,因为您已经重命名了父文件夹。如果是这种情况,您将需要更复杂的东西。

    【讨论】:

    • 不,实际上只是一层。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 2017-12-10
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    相关资源
    最近更新 更多