使用PowerShell重命名一个文件(并且不超过一个文件)

时间:2016-10-28 19:41:07

标签: powershell character filenames substitution

问题

我经常发现自己需要快速方法在我工作的时候在这里和那里重命名一个随机文件。我需要将这些文件名下载到与Web标准兼容的结构和一些个人需求。以下几个例子:

When I find                         I need
----------------------------------  -----------------------------------------
Welcome to the party.JPG            welcome_to_the_party.jpg
Instructions (and some other tips)  instructions_and_some_other_tips
Bar Drinks – The Best Recipes       bar_drinks_the_best_recipes
La mañana del águila y el ratón     la_manana_del_aguila_y_el_raton

基本上我需要:

  • 所有大写字符变为小写
  • 空格成为下划线
  • 其他语言的其他一些特殊字符和变音符号将成为最接近的匹配(á是a,é是e,ç是c,依此类推......)
  • 像()[] {}'这样的符号; ,完全消失
  • 也许有些替换(可选)为:#= no; @ = at或& =和

不是问题,只是仅供参考,你可以看到大局

我将使用注册表项[HKEY_CLASSES_ROOT * \ shell ...],因此我可以通过右键单击所需文件来调用批处理文件和/或PowerShell脚本,并传递参数信息(相关文件)这样的脚本。

我的猜测

我一直在密切关注PowerShell Scripts,但我对这个领域并不是很了解,到目前为止提供的所有解决方案都是针对整个文件夹(Dir / Get-ChildItem)而不是特定文件

例如,我成功使用下面的行(PowerShell)用下划线替换所有空格,但它也会影响目录中的其他文件。

Dir | Rename-Item –NewName { $_.name –replace “ “,”_“ }

同样,我不需要为整个文件夹解决这个问题,因为我已经有办法使用像Total Commander这样的软件。

感谢你给我的任何帮助。

鲁伊奎拉

3 个答案:

答案 0 :(得分:1)

可能是这段代码可以帮到你

    function Remove-Diacritics([string]$String)
    {
        $objD = $String.Normalize([Text.NormalizationForm]::FormD)
        $sb = New-Object Text.StringBuilder

        for ($i = 0; $i -lt $objD.Length; $i++) {
            $c = [Globalization.CharUnicodeInfo]::GetUnicodeCategory($objD[$i])
            if($c -ne [Globalization.UnicodeCategory]::NonSpacingMark) {
              [void]$sb.Append($objD[$i])
            }
          }

        return("$sb".Normalize([Text.NormalizationForm]::FormC))
    }

    function Clean-String([string]$String)
    {
        return(Remove-Diacritics ($String.ToLower() -replace "#", "no" -replace "\@", "at" -replace "&", "and" -replace "\(|\)|\[|\]|\{|\}|'|;|\,", "" -replace " ", "_"))
    }


    $youfile="C:\tmp4\121948_DRILLG.tif"
    $younewnamefile=Clean-String $youfile
    Rename-Item -Path $youfile $younewnamefile

答案 1 :(得分:0)

将此脚本放在某处(让我们称之为WebRename.ps1):

$old = $args -join ' '
$new = $old.ToLower().Replace(' ', '_')
# add all the remaining transformations you need here
Rename-Item $old $new

在注册表中使用它作为命令(当然有你自己的路径):

PowerShell -c C:\WebRename.ps1 "%1"

答案 2 :(得分:0)

如果您希望能够快速执行此操作并且始终希望进行相同的更改,则可以将以下函数添加到.psm1文件中,然后将该文件放在一个模块文件夹中(C:\ Program Files \ WindowsPowerShell \ Modules是最常见的一个)你可以在任何需要快速重命名文件时调用WebRename-File filePath ,该功能以这种方式设置如果您传入一个文件路径,或者如果您确实需要进行批量重命名,则可以将get-childitem的结果传递给它。

function WebRename-File {
    param(
    [parameter(Mandatory=$true,ValueFromPipeline=$true)]
      $filePath
    )

    begin{}
    Process{
        foreach($path in $filePath){
            $newPath = $path.ToLower()
            $newPath = $newPath.Replace(' ','_')

            ###add other operations here###

            Rename-Item -Path $path -NewName $newPath
        }
    }
    end{}
}