Powershell递归文件名读取和重命名

Powershell递归文件名读取和重命名

我已经使用 wget 从我的 ftp 服务器下载了一个目录树并强制使用 ascii 编码,所以现在我有很多文件夹和文件名称,类似于“foo%C3%BC”(其中一些文件/文件夹已经有正确的名称,因为它们只有 ascii 字符)。

我现在尝试使用 powershell 将它们转换回 utf-8,我尝试编写以下行来实现这一点

Get-ChildItem C:\Users\Administrator\Desktop\folder -Recurse | select BaseName | Rename-Item -NewName {[System.Web.HttpUtility]::UrlDecode{BaseName}}

但这不起作用并给出以下错误

Rename-Item : Cannot rename because item at '@{BaseName=filename}' does not exist.
At line:1 char:88
+ ... ect BaseName | Rename-Item -NewName {[System.Web.HttpUtility]::UrlDecode{BaseNam ...
+                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidOperation: (:) [Rename-Item], PSInvalidOperationException
+ FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.RenameItemCommand

一遍又一遍(我想对于找到的每个文件都重复一次)。

该命令在“select BaseName”之后与管道紧密相关,因此问题出在重命名部分。

有人知道如何让它工作吗?

答案1

有点晚了,但我想为可能遇到这个问题的人发布一个答案(我刚想起我在找到答案后就发布了它)

以下代码片段正是我需要的

Add-Type -AssemblyName System.Web;

# Get the filenames and order them to have the files first, this avoids problems when renaming them
$data =  get-childitem C:\Users\Administrator\Desktop\folder -recurse | Sort-Object FullName -descending;

# Cycle every file
ForEach($dat in $data){

     # Get the decoded UTF-8 name
     $decoded = [System.Web.HttpUtility]::UrlDecode($dat.name);

     # Rename the file if the decoded name is different than the current one
     if ($dat.name -ne $decoded){ren $dat.FullName $decoded}

}

我最初的方法存在一个问题,即文件夹在重命名文件夹内的文件之前就被重命名了,这意味着单个文件的路径不再正确。我通过按降序对路径列表进行排序解决了这个问题,这样单个文件首先被重命名,并添加了一个检查,只有当文件的名称由于编码而更改时才会重命名文件。

相关内容