如何根据匹配的通配符模式的文字成分对文件名进行大小写规范化?
请考虑以下文件名:
ABC_1232.txt
abC_4321.Txt
qwerty_1232.cSv
QwErTY_4321.CsV
它们都与以下通配符模式匹配:
QWERTY_*.csv
abc_*.TXT
请注意模式的字面成分(例如QUERTY_
,.csv
)与上面列表中的匹配文件(例如{{1 }},QwErTY
。
我想重命名匹配的文件,以便 pattern 的字面部分在文件名中精确地使用。因此,结果名称应为:
.CsV
给Vladimir Semashkin的帽子提示来启发这个问题。
答案 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
}
}
}
-转义)。
`