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

时间:2016-11-04 12:50:37

标签: powershell powershell-v2.0

我已经从我的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"之后直接运行到管道。所以问题在于重命名部分。

有没有人知道如何让它发挥作用?

2 个答案:

答案 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的话,它就会发挥作用。