0

このタイプの命名規則を使用して、ディレクトリに 10,000 個のドキュメントがあります。

1050_14447_Letter Extension.pdf、1333_14444_Letter.docx など...

このスクリプトを使用して、2 番目のアンダースコア (2 番目のアンダースコアを含む) の前のすべての文字を削除しようとしました。

Get-ChildItem -Filter *.pdf | Rename-Item -NewName {$_.Name -replace '^[0-9_]+'}

これは機能しましたが、ファイル名が重複することが明らかになりました。

スクリプトがファイル名 (拡張子を除いたもの) に基づいてサブフォルダーを作成できる方法があるかどうか疑問に思っていますか? したがって、メイン フォルダーには 10K のサブフォルダーが存在します。各サブフォルダーには 1 つのファイルしかありません。

4

1 に答える 1

1

これはうまくいくはずです。アイテムごとに新しいフォルダーを作成し、それを移動して、その過程で名前を変更します。

gci | ? {!$_.PSIsContainer} | % {New-Item ".\$($_.BaseName)" -Type Directory; Move-Item $_ ".\$($_.BaseName)\$($_.Name -replace '^[0-9_]+')"}

名前が同じで拡張子が異なる 2 つのファイルがある場合、ディレクトリを作成しようとするとエラーが表示されますが、両方のファイルが同じフォルダーに作成されることに注意してください。

あるいは、もっと読みやすいものをスクリプトに保存したい場合、これは機能的には同じです:

$files = Get-ChildItem | Where-Object {!$_.PSIsContainer}
foreach ($file in $files)
{
    $pathName = ".\" + $file.BaseName
    New-Item $pathName -Type Directory
    $newFileName = $pathName + "\" + ($file.Name -replace '^[0-9_]+')
    Move-Item $file $newFileName
}
于 2012-11-30T21:55:53.530 に答える