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}'
- v6.1+(仅限PowerShell Core):作为替换操作数的脚本块(
不敏感地匹配大小写(也可以写成-replace
);要执行区分大小写的匹配,请使用表单-ireplace
-creplace
在字符串类型的
操作数中引用正则表达式捕获的“替换语言”本身不是正则表达式-不进行匹配,只支持对正则表达式匹配结果的引用,通过$
-前缀占位符,这些占位符不能与PowerShell变量混淆
- PowerShell的文档(现在)在其概念帮助主题中简要解释了替换字符串的语法
- 有关完整信息,请参阅.NET framework帮助主题,该主题适用,因为PowerShell的
使用此方法 在幕后-replace
字符串中支持的参考(摘自上面链接的页面,并添加了强调和注释):
(例如,$number
)。。。在替换字符串中包括由基于$1
的1
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 }