3

我正在尝试重命名文件名中包含括号的文件。这似乎不起作用,因为 powershell 将 [] 视为特殊字符并且不知道该怎么做。

我的计算机上有一个文件夹 c:\test。我希望能够查看该文件夹并重命名文件的所有文件或部分。以下代码似乎有效,但如果文件中包含任何特殊字符,则代码将失败:

Function RenameFiles($FilesToRename,$OldName,$NewName){

    $FileListArray = @()
    Foreach($file in Get-ChildItem $FilesToRename -Force -Recurse  | Where-Object {$_.attributes -notlike "Directory"})
    {
        $FileListArray += ,@($file)
    }

    Foreach($File in $FileListArray)
    {
        IF ($File -match $OldName )
        {
            $File | rename-item -newName {$_ -replace "$OldName", "$NewName" }
        }
    }
}

renamefiles -FilesToRename "c:\test" -OldName "testt2bt" -NewName "test"

我确实找到了一个类似的问题:Replace square bracket using Powershell,但我不明白如何使用答案,因为它只是一个解释错误的链接:

4

4 回答 4

11

对于多个文件,这可以用一行来完成。

要删除支架,您应该尝试:

get-childitem | ForEach-Object { Move-Item -LiteralPath $_.name $_.name.Replace("[","")}
于 2014-11-12T12:43:27.233 回答
7
Move-Item -literalpath "D:\[Copy].log" -destination "D:\WithoutBracket.txt"

literalpath开关与 Move-Item cmdlet 一起使用 [而不是使用 rename-item cmdlet]

于 2012-06-10T20:18:58.520 回答
3

就括号而言,您已经在旧的Technet Windows PowerShell Tip of the Week中获得了 Microsoft 官方答案。

您可以使用 :

Get-ChildItem 'c:\test\``[*``].*'
于 2012-06-10T20:17:34.003 回答
2

感谢大家的帮助,你们都帮了很多忙,这是我在阅读您的回复后最终提出的解决方案。

我的电脑上有一个名为 c:\test 的文件夹,其中有一个名为“[abc] testfile [xas].txt”的文件,我希望将其命名为 testfile2.txt

Function RenameFiles($FilesToRename,$OldName,$NewName){

$FileListArray = @()
Foreach($file in Get-ChildItem $FilesToRename -Force -Recurse  | Where-Object {$_.attributes -notlike "Directory"})
{
    $FileListArray += ,@($file.name,$file.fullname)
}

Foreach($File in $FileListArray)
{
    IF ($File -match $OldName )
    {
        $FileName = $File[0]
        $FilePath = $File[1]

        $SName = $File[0]  -replace "[^\w\.@-]", " "

        $SName = $SName -creplace '(?m)(?:[ \t]*(\.)|^[ \t]+)[ \t]*', '$1'

        $NewDestination = $FilePath.Substring(0,$FilePath.Length -$FileName.Length)
        $NewNameDestination = "$NewDestination$SName"
        $NewNameDestination | Write-Host

        Move-Item -LiteralPath $file[1] -Destination $NewNameDestination
        $NewNameDestination | rename-item -newName {$_ -replace "$OldName", "$NewName" }

        }
    }
}


renamefiles  -FilesToRename "c:\test" -OldName "testfile" -NewName "testfile2"
于 2012-06-11T15:07:05.307 回答