【问题标题】:Remove end of filename using PowerShell使用 PowerShell 删除文件名的结尾
【发布时间】:2015-06-20 14:47:29
【问题描述】:

是否可以使用 PowerShell 删除文件夹中所有文件的文件名结尾?例子:

  • moira_by_kr0npr1nz-d8poqdb.jpg
  • shining_eye___step_by_step_by_ryky-d8pp6xh.jpg
  • 赎回___the_hunters_by_danluvisiart-d8oy1ef.jpg

所以我想删除从“by”到“.jpg”的所有内容。

【问题讨论】:

    标签: powershell filenames rename


    【解决方案1】:

    如何像这样使用正则表达式替换:

    Get-ChildItem -Filter "*.jpg" | % {
        Rename-Item $_.FullName -NewName ($_.FullName -replace '_by_.*\.jpg$', '')
    } 
    

    如果正则表达式未找到匹配项,则文件名保持不变。

    【讨论】:

      【解决方案2】:

      我会使用 ForEach 循环来做到这一点,如下所示:

      gci e:\temp\*.jpg | % {
      Rename-Item -path $_.FullName -NewName "$($_.Name.Substring(0,$_.Name.LastIndexOf('by')))$($_.Extension)" -WhatIf }
      
      What if: Performing the operation "Rename File" on target "Item: E:\temp\moira_by_kr0npr1nz-d8poqdb.jpg Destination: E:\temp\moira_.jpg".
      What if: Performing the operation "Rename File" on target "Item: E:\temp\redemptionthe_hunters_by_danluvisiart-d8oy1ef.jpg Destination: E:\temp\redemptionthe_hunters_.jpg"
      What if: Performing the operation "Rename File" on target "Item: E:\temp\shining_eyestep_by_step_by_ryky-d8pp6xh.jpg Destination: E:\temp\shining_eyestep_by_step_.jpg".
      

      逻辑是我们得到一个我们想要的文件列表(例如所有 JPG),然后我们使用 ForEach-Object 遍历它们,并指定 NewName 参数来更改名称。

      我将分解那里的引号内发生的事情:

      1. 获取名称并查找单词“by”最后一次出现的时间,它返回字符串内的数字位置(索引)
      2. 使用 SubString 命令选择从字符串开头到上面的所有内容,从开头到最后一次出现“by”这个词的所有内容。
      3. 获取文件的原始扩展名并确保将其附加到末尾。

      我在一个包含几个这样的文件的目录上测试了它,它就像一个魅力。使用 -WhatIf 运行一次,这样您就可以看到会发生什么。如果您喜欢您所看到的,请再次运行它而不使用 -WhatIf。

      【讨论】:

        【解决方案3】:

        是的,您可以对文件BaseName 使用LastIndexOf() 方法来找出将其切断的位置,然后使用Substring()

        Set-Location C:\path\to\folder
        
        Get-ChildItem -Path $PWD -Filter "*.jpg" |ForEach-Object {
            if(($lastIndex = $_.BaseName.LastIndexOf("_by_")) -ne -1){
                $NewName = "{0}{1}" -f $_.BaseName.Substring(0, $lastIndex),$_.Extension
                Rename-Item $_.FullName -NewName $NewName
            }
        }
        

        如果LastIndexOf() 找不到我们要查找的子字符串(在本例中为_by_),则返回-1,在这种情况下不应该做任何事情

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-07-21
          • 1970-01-01
          • 2021-09-27
          • 2023-04-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-03
          • 1970-01-01
          相关资源
          最近更新 更多