【问题标题】:Renaming one file (and nothing more than ONE file) using PowerShell使用 PowerShell 重命名一个文件(仅是一​​个文件)
【发布时间】:2016-10-28 19:41:07
【问题描述】:

问题

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

当我发现我需要 ---------------------------------- ---------------- ------------------------- 欢迎参加派对.JPG welcome_to_the_party.jpg 说明(和一些其他提示) instructions_and_some_other_tips 酒吧饮品——最佳食谱 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 or & = and

不是问题,只是仅供参考,您可以看到全局

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

我的猜测

我一直在仔细研究 PowerShell 脚本,但我对这个领域还不是很了解,到目前为止提供的所有解决方案都是针对 整个文件夹 (Dir/Get-ChildItem) 而不是特定文件

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

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

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

感谢您能给我的任何帮助。

鲁伊

【问题讨论】:

  • 使用批处理文件,您只需使用多个 set 语句将一个字符替换为另一个字符。这是基本的字符串替换。所以用下划线替换空格:set var=%var: =_%
  • 我们在 Dostips.com 上还有一个批处理文件功能来进行小写转换。 dostips.com/DtCodeCmdLib.php#Function.toLower
  • 为什么要使用智能引号?那行不通……
  • 如果您需要 Powershell 解决方案,请从您的问题中删除批处理文件标签。
  • 正如@Squashman 已经说过的,您的大部分任务都可以通过简单的substring replacement 来完成;唯一相当具有挑战性的事情可能是用单个下划线替换像 space_-_space 这样的连续字符,但 for /F 可能会为此服务;无论如何,您需要展示自己的努力,因为 StackOverflow 不是免费的代码编写服务!

标签: powershell character filenames substitution


【解决方案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

【讨论】:

    【解决方案2】:

    将此脚本放在某处(我们称之为 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"
    

    【讨论】:

      【解决方案3】:

      如果您希望能够快速执行此操作并且始终希望进行相同的更改,您可以将以下函数添加到 .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{}
      }
      

      【讨论】:

      • 我运气不好。我直接从 .ps1 以及模块 .psm1 尝试了代码,并且文件没有更改。 :( 非常感谢您的宝贵时间,您的代码非常优雅!
      猜你喜欢
      • 2011-07-14
      • 1970-01-01
      • 2015-05-10
      • 1970-01-01
      • 2020-10-13
      • 2020-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多