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"

私は同様の質問を見つけました: Powershell を使用して角括弧を置き換えます、しかし、バグを説明する単なるリンクであるため、答えの使い方がわかりません:

4

4 に答える 4

11

複数のファイルの場合、これは 1 行で実行できます。

ブラケットを削除するには、次のことを試してください。

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"

[rename-item コマンドレットを使用する代わりに] Move-Item コマンドレットでliteralpathスイッチを使用します。

于 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

みんな助けてくれてありがとう。これは、あなたの返信を読んだ後、最終的に思いついた解決策です。

PC に 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 に答える