如何使用PowerShell中的HttpUtility.UrlEncode方法重命名文件?

时间:2016-06-07 23:24:16

标签: powershell

我有一堆html文件,我需要在将其上传到服务器之前使用url编码重命名。我试过了:

Get-ChildItem -Path c:\temp\ -Recurse -Filter *.html | Rename-Item -NewName { $_.Name.replace("*.html",[Web.Httputility]::UrlEncode("*.html")) }

但这不适用于编码,甚至可以以某种方式完成?

2 个答案:

答案 0 :(得分:1)

这是执行此操作的基本方法,based on this answer

(Get-ChildItem -Path c:\temp\ -Recurse -Filter *.html -File) |
foreach { ren $_.fullname ([uri]::EscapeDataString($_))}

最初我在()周围没有Get-ChildItem的情况下编写了它,但发现它仍在读取目录信息,而重命名已经重命名了第一个项目。然后重命名第二次重新编码第一个项目,从而使它有点大声。

这是一个更清洁的版本,首先处理文件,然后处理文件夹:

$files = Get-ChildItem -Path c:\temp\ -Recurse -Filter *.html -File
$folders = Get-ChildItem -Path c:\temp\ -Recurse -Filter *.html -Directory
$files | foreach { ren $_.fullname ([uri]::EscapeDataString($_))}
$folders | foreach { ren $_.fullname ([uri]::EscapeDataString($_))}

答案 1 :(得分:0)

根据你的回答,我这样做是为了让它发挥作用

(Get-ChildItem -Path c:\temp\ -Recurse -Filter *.html) |
foreach { ren $_.fullName ([uri]::EscapeDataString($_.Name))} | Out-Null

Get-ChildItem -Path c:\temp\ -Recurse | ?{ $_.PSIsContainer } |
 foreach { ren $_.fullName ([uri]::EscapeDataString($_.Name))}

首先我只做文件然后文件夹,因为当重置顶级文件夹时,其中的文件路径不再存在。