ファイルの名前を変更しようとすると、Powershell でファイルがパスを表していると表示されるのはなぜですか?

ファイルの名前を変更しようとすると、Powershell でファイルがパスを表していると表示されるのはなぜですか?

「+1.txt」というファイル名を「+2.txt」に変更したい

私の Powershell スクリプトは次のとおりです:

$old = "\+1"
$new = "\+2"
Get-ChildItem | Rename-Item -NewName {$_.name -replace $old, $new }

結果は次のようになります:

powershell : Rename-Item : Cannot rename the specified target, because it represents a path

これを修正するにはどうすればいいでしょうか?

答え1

PowerShell の正しいエスケープ文字は ` (バックティック) です。

たとえば、改行を含む文字列を取得するには、次のように記述します。

$newline = "`n" 

さらに、少なくともテストでは、エスケープする必要はありませんでした。そのため、そのまま機能しました。Rename-Item "+1.txt" "+2.txt"を使用してみると、-replace最初の引数にはバックスラッシュが必要でしたが、2 番目の引数には必要ありませんでした。その$new = "+2"ため、機能するはずです。その理由は、の最初の引数が-replace正規表現である可能性があるためです。そのため、項には特別に処理されないリテラル + が必要です。2 番目の項はリテラル文字列として処理されるため、特別なエスケープなどは必要ありません。

答え2

-replace正規表現を使用しますが、手動で文字をエスケープする必要はありません。Get
-ChildItemは現在のパス内のすべての項目を反復処理するため、名前を指定する必要があります。

$old = "+1.txt"
$new = "+2.txt"
Get-ChildItem $old -file| 
  Rename-Item -NewName {$_.FullName -replace [regex]::escape($old), $new }

または where to -matchonly パターンを使用します。

$old = "+1.txt"
$new = "+2.txt"
Get-ChildItem | 
  where Name -match [regex]::escape($old)|
    Rename-Item -NewName $new 

関連情報