Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 通过重新格式化与-replace运算符一起使用的替换字符串中的现有文件名-占位符来重命名文件_Powershell_File_Replace_Rename_Regex_Wildcards - Fatal编程技术网

Powershell 通过重新格式化与-replace运算符一起使用的替换字符串中的现有文件名-占位符来重命名文件

Powershell 通过重新格式化与-replace运算符一起使用的替换字符串中的现有文件名-占位符来重命名文件,powershell,file,replace,rename,regex,wildcards,Powershell,File,Replace,Rename,Regex,Wildcards,我有一些像这样的视频文件: VideoName_s01e01.mp4其中季节和情节是可变的。我想在s???和e???之间添加一个下划线(“”) 我一直在使用重命名,我有一个出发点: GCI $path -filter '*_s??e??*' -rec | Ren -new { $_.name -replace '_s[0-9][0-9]', '_s[0-9]_[0-9]_' } -passthru 这实际上重命名了我的文件VideoName\u s[0-9]\u e[0-9].mp4

我有一些像这样的视频文件:
VideoName_s01e01.mp4
其中季节和情节是可变的。我想在
s???
e???
之间添加一个下划线(“”)

我一直在使用重命名,我有一个出发点:

GCI $path -filter '*_s??e??*' -rec |  Ren -new { $_.name -replace '_s[0-9][0-9]', '_s[0-9]_[0-9]_' } -passthru    
这实际上重命名了我的文件
VideoName\u s[0-9]\u e[0-9].mp4

基本上,我在寻找字符
s??e???
我只是不知道如何在replace部分使它们成为变量

我认为最好的方法是:

  • 找到
    e??s???
    (我们称之为X)的位置
  • X-3
    处拆分字符串
  • 中间用“<代码> <代码/代码>”连接字符串。
    -replace
    正在使用,而不是。因此,您必须将替换更改为:

    -replace '_s([0-9]{1,2})e([0-9]{1,2})', '_s$1_e$2_'
    

    我强烈推荐regex101.com学习regex

    像这样的方法可以奏效:

    "VideoName_s01e01.mp4" -replace '(.*s)(\d+)(e.*)', '$1$2_$3'
    
    给出:

    VideoName_s01_e01.mp4
    
    ,但值得深入挖掘:

    PowerShell的
    -replace
    运算符(
    ..-replace[,]
    ):

    • 将a作为其第一个操作数,
      (搜索表达式),并始终全局匹配,即替换所有匹配项

      • 'bar'-替换'[ra]','@'
        ->
        'b@'
    • 指定替换表达式(
      )是可选的,在这种情况下,空字符串将替换匹配的内容,从而有效地删除它

      • 'bar'-替换'[ra]'
        ->
        'b'
    • 如果指定了
      ,则它支持两种形式:

      • v6.1+(仅限PowerShell Core):作为替换操作数的脚本块(
        {…}
        ),它在每次匹配的基础上提供替换字符串的完全动态计算-有关示例,请参阅

        • 'bar'-替换'[ra]',{'{'+$\.Value+'}}
          ->
          'b{a}{r}'
      • 包含一个表达式的字符串,该表达式可以引用正则表达式捕获(和未捕获)的内容,例如
        $&
        以引用匹配的内容,详细说明如下

        • 'bar'-替换'[ra]','{$&}'
          ->
          'b{a}{r}'
    • -replace
      不敏感地匹配大小写(也可以写成
      -ireplace
      );要执行区分大小写的匹配,请使用表单
      -creplace


    在字符串类型的
    操作数中引用正则表达式捕获的“替换语言”本身不是正则表达式
    -不进行匹配,只支持对正则表达式匹配结果的引用,通过
    $
    -前缀占位符,这些占位符不能与PowerShell变量混淆

    • PowerShell的文档(现在)在其概念帮助主题中简要解释了替换字符串的语法

    • 有关完整信息,请参阅.NET framework帮助主题,该主题适用,因为PowerShell的
      -replace
      使用此方法 在幕后

    为方便起见,以下是
    字符串中支持的参考(摘自上面链接的页面,并添加了强调和注释):

    • $number
      (例如,
      $1
      )。。。在替换字符串中包括由基于
      1
      number
      标识的捕获组匹配的最后一个子字符串,其中number是十进制值

      • 注释:
        • 在正则表达式中包含带括号的子表达式
          (…)
          ,将隐式创建一个捕获组(捕获组)。默认情况下,此类捕获组未命名,必须由其基于
          1
          的(十进制)索引引用,该索引反映了它们在正则表达式中出现的顺序,因此
          $1
          指正则表达式中第一个捕获的组,
          $2
          指第二个捕获的组

        • 还支持用于消除数字歧义的
          ${number}
          (例如
          ${1}
          )形式(例如,为了确保识别
          $$1
          ,即使后面紧跟着
          000
          ,请使用
          ${1}000

        • 您可以命名捕获组并按名称引用它们,而不是依赖索引来引用未命名的捕获组-请参阅下一点

        • 如果您对捕获组匹配的内容不感兴趣,可以选择忽略它,方法是使用
          (?:…)
          将其转换为非捕获组

    • ${name}
      。。。包括替换字符串中由
      (?…)
      指定的命名组匹配的最后一个子字符串

    • $$
      。。。在替换字符串中包含单个
      “$”
      文本

    • $&
      。。。在替换字符串中包含整个匹配项的副本(
      $0
      也可以,即使它是)

    • $`
      。。。在替换字符串中包含匹配前输入字符串的所有文本

    • $”
      。。。在替换字符串中包含匹配后输入字符串的所有文本

    • $+
      。。。包括替换字符串中捕获的最后一组。[这使您无需了解最后一组的具体索引。]

    • $\uu
      。。。在替换字符串中包含整个输入字符串

    最后,请注意:

    • -始终替换
      $exampleoffile = @"
      namev1_s01e01.mp4
      namvev2_s03e02.mp4
      VideoName_s20e15.mp4
      VideoName_s15e1.mp4
      VideoName_s1e16.avi
      VideoName_s1e23.mv
      "@
      
      $template=@"
      {file*:{prefix:Test1}_s{season:01}e{episode:01}{extension:.mp4}}
      {file*:{prefix:1xxx}_s{season:100}e{episode:5}{extension:.mp4}}
      {file*:{prefix:yyy3}_s{season:10}e{episode:02}{extension:.havi}}
      "@
      
      
      
      $exampleoffile | ConvertFrom-String -TemplateContent $template | 
      % { "{0}_{1:D2}_e{2:D2}{3}" -f $_.file.prefix, [int]$_.file.season, [int]$_.file.episode, $_.file.extension }