如何使用PowerShell从文件名中删除多余的空格?

3

我试图删除文件名中左括号后的所有内容,结果在运行以下命令时不小心添加了很多空格:

Dir | Rename-Item -NewName { $_.Name -replace "()"," "}

这是使用PowerShell操作的。我想这可能与没有明确表达"()"字符不是某个表达式的一部分有关,而我没有意识到这一点。我有许多文件,例如:

H o w T o C r a f t () [.zip

或者

V i d e o G a m e () [.zip

这些文件名每个单词之间有一个空格,每个字母之间有两个空格。现在我需要将它们转换为:

How To Craft.zip

Video Game.zip

但我对正则表达式和PowerShell非常新手。如果有人能帮助我使用一条命令来删除单词之间的双重空格,字母之间的单个空格以及任何字符(和括号后的所有文本),那么它将解决我的所有问题。

2个回答

1
你可以使用正则表达式中的 \s 空格字符类来替换空格,Trim() 函数来删除末尾的特殊字符,并使用 this brilliant regex pattern 在每个单词之间加入空格。
$Files = Get-ChildItem .\ -Name

$CamelCasePattern = '([A-Z])([A-Z])([a-z])|([a-z])([A-Z])'
$CamelCaseReplace = '$1$4 $2$3$5'

foreach($FileName in $Files){
    # Get the files base name
    $basename = [System.IO.Path]::GetFileNameWithoutExtension($FileName)

    # Remember the extension
    $extension = $FileName.Substring($basename.Length)

    # Remove all whitespace
    $basename = $basename -ireplace '\s',''
    # Remove excess characters at the end
    $basename = $basename.TrimEnd('()[')
    # introduce space after each capitalized word
    $basename = $basename -creplace $CamelCasePattern,$CamelCaseReplace

    # return correct file name
    "$basename$extension"
}

0
您可以使用以下正则表达式替换来恢复文件名:
 (?! )|[()\[\]]+ [()\[\]]+(?=\.)|( )

或者

\s(?!\s)|[()\[\]]+\s+[()\[\]]+(?=\.)|(\s)

替换为:$1

请参见演示1演示2

因此,现在它看起来像:

Dir | Rename-Item -NewName { $_.Name -replace "\s(?!\s)|[()\[\]]+\s+[()\[\]]+(?=\.)|(\s)","$1"}

这将从我的文件中删除所有空格,并不会删除后面的() [****]。下一步是在任何大写字母之前添加一个空格。 - Xenos
好的,实际上你可以在每个大写字母前插入一个空格(使用(?<=\p{Lu}) => 和 空格 作为替换)。 - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接