6

PowerShell で名前変更スクリプトを作成するのにかなり苦労しています。状況: ディレクトリに、「4 桁 - テキスト - ジャンク」という形式で名前を付けたフォルダがあります。名前を「テキスト (4 桁)」に変更したい

今、いくつかのサンプル名を使って遊ぶためのディレクトリを作成しました:

1996 - 何か面白い - 何かくだらない

2006 - これをコピー - 無視

最初に名前をエコーするスクリプトを設定しようとしましたが、正規表現のコツがわかりません。次のコードは、「1996 - something」と「2006 - copy」を出力するだけです。

Get-ChildItem | Foreach-Object { if ($_.BaseName -match "(\d{4} - \w+ -*)") { echo $matches[0]}}

これは「1996 - 何か面白い - 何かくだらない \n ()」と「2006 - これをコピー - 無視\n ()」と出力します。

Get-ChildItem | Foreach-Object { echo ($_.BaseName -replace "(\d{4} - \w+ - *)"), "$2 ($1)"}

どちらのアプローチもリテラル文字列「 - 」をマッチングの境界として尊重しない理由を誰かに教えてもらえますか?

*編集* zespriに感謝します。私の問題を解決したコードは

Get-ChildItem | Foreach-Object {
if ($_.BaseName -match "(\d{4} - [^-]*)") { 
  Rename-Item $_ ($_.BaseName -replace "(\d{4}) - (.+)(?= -).*" ,'$2 ($1)')
  }
}
4

2 に答える 2

6

これはあなたのために働きますか:

Get-ChildItem | Foreach-Object { 
  if ($_.BaseName -match "(\d{4} - [^-]*)") { 
      echo $matches[0].TrimEnd()
    }
}

TrimEnd に注意してください。これは、2 番目のダッシュの前にある末尾のスペースを削除するためです。

例が機能しない理由については、 \w+ は任意の単語文字と一致するため、「何か興味深い」内のスペースと一致しません。* はゼロ以上を意味します。したがって、 -* はゼロ以上のダッシュに一致します。あなたの場合はゼロです。

あなたのために働くかもしれない式を書く別の方法は次のとおりです。

Get-ChildItem | Foreach-Object { 
  if ($_.BaseName -match "(\d{4} - .+(?= -))") { 
      echo $matches[0]
    }
}

ここで、(?= -)構文は正の先読みアサーション です。この場合、末尾の余分なスペースは正規表現自体で考慮されるため、削除する必要はありません。

更新 1

変換を行うように変更:

gci | %{ $_.BaseName -replace "(\d{4}) - (.+)(?= -).*" ,'$2 ($1)' }
于 2013-06-04T22:44:56.917 に答える
1

これを試して:

Get-ChildItem | 
    Select-String -Pattern '(\d{4})\s+-\s+(\w+(\s+\w+)*)\s+-.*' |
    Foreach-Object { "$($_.Matches.Groups[2].Value) ($($_.Matches.Groups[1].Value))" }
于 2013-06-06T00:19:56.283 に答える