替换文件夹PowerShell中文件中的文本

替换文件夹PowerShell中文件中的文本,powershell,Powershell,我有一个文件夹,其中包含像“goodthing 2007adsdff.pdf”、“betterthing 2007adfdsw.pdf”和“bestthing_2007fdsfad.pdf”这样的文件,我希望能够重命名它们,删除所有文本,包括2007或_2007,直到字符串keeping.pdf的结尾,并得到以下结果:'goodthing.pdf''betterthing.pdf''bestthing.pdf'我已经用“_2007”尝试过了,但还没有找到处理“2007”的条件。任何关于如何实现这

我有一个文件夹,其中包含像“goodthing 2007adsdff.pdf”、“betterthing 2007adfdsw.pdf”和“bestthing_2007fdsfad.pdf”这样的文件,我希望能够重命名它们,删除所有文本,包括2007或_2007,直到字符串keeping.pdf的结尾,并得到以下结果:'goodthing.pdf''betterthing.pdf''bestthing.pdf'我已经用“_2007”尝试过了,但还没有找到处理“2007”的条件。任何关于如何实现这一点的建议都将不胜感激

Get-ChildItem 'C:Temp\' -Name -Filter *.pdf | foreach { $_.Split("_2017")[0].substring(0)}

在不知道所有潜在文件名称的情况下,我可以提供100%的解决方案:

PS> $flist = ("goodthing 2007adsdfff.pdf","betterthing 2007adfdsw.pdf","bestthing_2007fdsfad.pdf")
PS> foreach ($f in $flist) {$nicename = ($f -replace "([\w\s]+)2007.*(\.\w+)", '$1$2') -replace "[\s_].","." ;$nicename}

goodthing.pdf
betterthing.pdf
bestthing.pdf
两大挑战:

  • 下划线实际上是\w字符类的一部分。因此,上述方法的另一种选择是将正则表达式复杂化,或者尝试假设在2007年之前总是只有一个“ux”。对我来说,这两件事似乎都有风险

  • 如果文件名中有空格,则无法确定是否会遇到多个空格。此解决方案仅删除2007年之前的一个

  • 魔法:

    -replace操作符使您能够快速捕获()中的文本,并在$1$2之类的变量中重复使用它。如果您有更复杂的捕获,您只需要确定它们的分配顺序


    希望这有帮助。

    在不知道所有潜在文件名称的情况下,我可以提供100%的解决方案:

    PS> $flist = ("goodthing 2007adsdfff.pdf","betterthing 2007adfdsw.pdf","bestthing_2007fdsfad.pdf")
    PS> foreach ($f in $flist) {$nicename = ($f -replace "([\w\s]+)2007.*(\.\w+)", '$1$2') -replace "[\s_].","." ;$nicename}
    
    goodthing.pdf
    betterthing.pdf
    bestthing.pdf
    
    两大挑战:

  • 下划线实际上是\w字符类的一部分。因此,上述方法的另一种选择是将正则表达式复杂化,或者尝试假设在2007年之前总是只有一个“ux”。对我来说,这两件事似乎都有风险

  • 如果文件名中有空格,则无法确定是否会遇到多个空格。此解决方案仅删除2007年之前的一个

  • 魔法:

    -replace操作符使您能够快速捕获()中的文本,并在$1$2之类的变量中重复使用它。如果您有更复杂的捕获,您只需要确定它们的分配顺序

    希望这能有所帮助。

    尝试以下方法:

    Get-ChildItem 'C:\Temp' -Name -Filter *.pdf |
      Rename-Item -NewName { $_.Name -replace '[_ ][^.]+' } -WhatIf
    
    注意:上面命令中的预览操作。一旦确定操作将执行所需操作,请删除
    -WhatIf

    上面使用带有a和的
    重命名项
    ,如下所示:

    • 正则表达式与第一个空格或字符中的所有内容匹配。(字符集
      [\u]
      )到以下文字
      字符。(
      [^.]+
      匹配一个或多个字符,而不是(
      ^
      )而不是
      )-也就是说,从第一个
      /
      \
      到文件扩展名的所有内容(不包括

      • 注意:为了防止文件名匹配,例如
        \u 2017.pdf
        匹配(这将导致新名称仅为
        .pdf
        ),请使用以下正则表达式:
        ”(?尝试以下操作:

        Get-ChildItem 'C:\Temp' -Name -Filter *.pdf |
          Rename-Item -NewName { $_.Name -replace '[_ ][^.]+' } -WhatIf
        
        注意:上述命令中的预览操作。一旦确定操作将执行所需操作,请删除
        -WhatIf

        上面使用带有a和的
        重命名项
        ,如下所示:

        • Regex
          [\][^.]+
          匹配从第一个空格或
          字符(字符集
          [\]
          )到以下文本
          字符的所有内容。(
          [^.]+
          匹配一个或多个字符。除了(
          ^
          )之外,其他字符都匹配
          )-也就是说,从第一个
          /
          到文件扩展名(不包括


          • 注意:为了防止像
            \u 2017.pdf
            这样的文件名匹配(这只会导致
            .pdf
            作为新名称),请使用以下正则表达式:
            '(
            -split
            操作符使用正则表达式,因此您可以使用>
            ($\uu.BaseName-split'\d{4}')[0]
            我喜欢它。这个正则表达式是多功能的,因为如果文件名中有多个空格,它会工作得很好。像“bestthing 2007asdfda.pdf”和“bestthing 2007dfsfds.pdf”这样的东西会被选中输出“bestthing.pdf”和“bestthing.pdf”非常感谢!很高兴能帮上一点忙…[咧嘴笑]
            -split
            操作符使用正则表达式,因此您可以使用>>
            ($\uUbASENAME-split'\d{4}|{uUd{4}')[0]
            我喜欢它。这个正则表达式是通用的,因为如果文件名中有多个空格,它工作得很好。“best thing 2007asdfda.pdf”和“bestthing 2007dfsfds.pdf”之类的内容会被选中以输出“best thing.pdf”和“bestthing.pdf”谢谢你,非常欢迎!很高兴能帮上点忙…[咧嘴笑]很有趣。我删除了pdf过滤器,脚本工作得很好。谢谢you@RobbKrause这很奇怪,但我很高兴它能为你工作。很有趣。我删除了pdf过滤器,脚本工作得很好。谢谢you@RobbKrause这很奇怪,但我很高兴它对你有用。