根据通配符模式对文件名进行大小写标准化

时间:2018-08-22 15:40:46

标签: regex powershell case-sensitive file-rename wildcard-expansion

如何根据匹配的通配符模式的文字成分对文件名进行大小写规范化?

请考虑以下文件名:

ABC_1232.txt
abC_4321.Txt
qwerty_1232.cSv
QwErTY_4321.CsV

它们都与以下通配符模式匹配:

QWERTY_*.csv
abc_*.TXT

请注意模式的字面成分(例如QUERTY_.csv)与上面列表中的匹配文件(例如{{1 }},QwErTY

我想重命名匹配的文件,以便 pattern 的字面部分在文件名中精确地使用。因此,结果名称应为:

.CsV

Vladimir Semashkin的帽子提示来启发这个问题。

1 个答案:

答案 0 :(得分:1)

术语注释:由于 pattern 可以用于同时引用通配符表达式和正则表达式,因此术语glob用作通配符表达式的明确缩写。


基于字符串拆分的简单但有限的解决方案

具体来说,以下解决方案仅限于包含一个abc_1232.TXT abc_4321.TXT QWERTY_1232.csv QWERTY_4321.csv 作为唯一通配符元字符的通配符模式

*

带正则表达式的广义但更复杂的解决方案

此解决方案要复杂得多,但是可以与所有通配符表达式一起使用(只要不需要支持# Sample input objects that emulate file-info objects # as output by Get-ChildItem $files = @{ Name = 'ABC_1232.txt' }, @{ Name = 'abC_4321.TxT' }, @{ Name = 'qwerty_1232.cSv' }, @{ Name = 'QwErTY_4321.CsV' }, @{ Name = 'Unrelated.CsV' } # The wildcard patterns to match against. $globs = 'QWERTY_*.csv', 'abc_*.TXT' # Loop over all files. # IRL, use Get-ChildItem in lieu of $files. $files | ForEach-Object { # Loop over all wildcard patterns foreach ($glob in $globs) { if ($_.Name -like $glob) { # matching filename # Split the glob into the prefix (the part before '*') and # the extension (suffix), (the part after '*'). $prefix, $extension = $glob -split '\*' # Extract the specific middle part of the filename; the part that # matched '*' $middle = $_.Name.Substring($prefix.Length, $_.Name.Length - $prefix.Length - $extension.Length) # This is where your Rename-Item call would go. # $_ | Rename-Item -WhatIf -NewName ($prefix + $middle + $extension) # Note that if the filename already happens to be case-exact, # Rename-Item is a quiet no-op. # For this demo, we simply output the new name. $prefix + $middle + $extension } } } -转义)。

`