我已经从我的ftp服务器下载了一个使用wget和强制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
一遍又一遍(我想每发现一个文件一次)。
该命令在"选择BaseName"之后直接运行到管道。所以问题在于重命名部分。
有没有人知道如何让它发挥作用?
答案 0 :(得分:1)
[Reflection.Assembly]::loadWithPartialName("System.Web") | out-null
$data = Get-ChildItem C:\Users\Administrator\Desktop\folder -Recurse
ForEach($dat in $data){
$newName = [System.Web.HttpUtility]::UrlDecode($dat.Name);
$dat | Rename-Item -NewName $newName -Force
}
答案 1 :(得分:0)
我设法使用以下脚本
$data = get-childitem C:\Users\Administrator\Desktop\folder -recurse | Sort-Object FullName -descending;
ForEach($dat in $data){
$decoded = [System.Web.HttpUtility]::UrlDecode($dat.name);
if ($dat.name -ne $decoded){ren $dat.FullName $decoded}
}
如果只是为了在每次找到一个不需要转换的名称时抛出一个eror的话,它就会发挥作用。