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