web-dev-qa-db-ja.com

フォルダー内の複数のファイルの名前を変更し、プレフィックスを追加します(Windows)

フォルダー内のファイルの名前をバッチで変更して、フォルダーの名前を新しい名前の前に付けます。つまり、C:\house chores\のファイルはすべてhouse chores - $old_nameに名前が変更されます。

59
ofer.sheffer

オプション1:Windows PowerShellを使用する

Windowsメニューを開きます。 「PowerShell」と入力し、「Windows PowerShell」コマンドウィンドウを開きます。

目的のファイルのあるGotoフォルダー:例cd "C:\ house chores"注意:スペースが含まれる場合は、アドレスに引用符 ""を含める必要があります。

「dir」を使用して、フォルダー内のすべてのファイルを表示できます。 「|」を使用する次のコマンドの「dir」の出力をパイプライン処理します。

注:「dir」は「Get-ChildItem」のエイリアスです。 wiki:cmdlets を参照してください。さらに機能を提供できます。例えば'dir -recurse'は、すべてのファイル、フォルダー、およびサブフォルダーを出力します。

ある範囲のファイルだけが必要な場合はどうすればよいですか?

「dir |」の代わりに私は使えます:

dir | where-object -filterscript {($_.Name -ge 'DSC_20') -and ($_.Name -le 'DSC_31')} |

プレフィックスとしてディレクトリ名を使用してバッチ名を変更する場合:

dir | Rename-Item -NewName {$_.Directory.Name + " - " + $_.Name}

オプション2:コマンドプロンプトの使用

フォルダーでShiftキーを押しながら右クリックし、「コマンドウィンドウを開く」を選択します。

for %a in (*.*) do ren "%a" "prefix - %a"

多数のファイルがある場合、この前に「@echo off」コマンドを追加し、最後に「echo on」コマンドを追加するとよい場合があります。

115
ofer.sheffer

ここでの2つのPowershellの答えの問題は、名前変更プロセスの実行時に再配置されるディレクトリに応じて、スクリプトがファイル名の変更前と変更後の両方で実行される可能性があるため、プレフィックスが重複する可能性があることです。これを回避するには、単に-Excludeオプションを使用します。

Get-ChildItem -Exclude "house chores-*" | rename-item -NewName { "house chores-" + $_.Name }

これにより、プロセスが1つのファイルの名前を複数回変更することを防ぎます。

26
Dave.Gugg

フリーソフトウェア「 Bulk Rename Utility 」もうまく機能します(高度なタスクにも強力です)。 ダウンロード で、インストールには1分かかります。

元のWebサイトの screenshots および tutorial を参照してください。

-

画像を Creative Commons License でリリースする必要があるため、段階的なスクリーンショットを提供できません。また、ソフトウェアのスクリーンショットを所有していません。

免責事項:私はこのソフトウェア/会社とは一切関係ありません。私は自分のタスクのために製品が好きでした。それはOPと同様の要件を満たすので、お勧めです。

12
user216084

これは私にとってはうまくいきました。まず、ファイル名を変更したいディレクトリでcdしてから、次のコマンドを実行します。

Get-ChildItem | rename-item -NewName { "house chores-" + $_.Name }
11
user3971138

一部のアイテムでは、名前が変更されたアイテムの名前が再び変更されるため、髪を引き裂きました(最大ファイル名の長さに達しない限り、繰り返し)。これは、Get-ChildItemとdirの出力の両方で発生していました。名前の変更されたファイルは、アルファベット順の変更のために取得されたと思います。この問題は次の方法で解決しました。

Get-ChildItem -Path . -OutVariable dirs
foreach ($i in $dirs) { Rename-Item $i.name ("<MY_PREFIX>"+$i.name) }

これにより、Get-ChildItemによって返された結果が変数$ dirsに「ロック」され、順序が変更されたり、他の面白いビジネスが発生することを恐れずに繰り返し処理できます。

-Excludeを使用するためのDave.Guggのヒントもこの問題を解決するはずですが、これは別のアプローチです。おそらく、名前を変更するファイルにプレフィックスで使用されているパターンが既に含まれている場合です。

(免責事項:私はPowerShell n00bです。)

1
phantom-99w

@ ofer.shefferの回答に基づいて、このコマンドはファイル名を一括変更し、現在の日付を追加します。すなわち、「file.txt」は、現在のフォルダー内のすべてのファイルに対して「20180329-file.txt」になります

for %a in (*.*) do ren "%a" "%date:~-4,4%%date:~-7,2%%date:~-10,2% - %a"
1
karpa

私はそれが古い質問であることを知っていますが、さまざまな答えから多くを学びましたが、関数としての独自の解決策を思いつきました。これは、特定のパターンに一致するすべてのファイルにプレフィックスとして親フォルダを動的に追加する必要がありますが、そのプレフィックスがまだない場合のみです。

function Add-DirectoryPrefix($pattern) {
    # To debug, replace the Rename-Item with Select-Object
    Get-ChildItem -Path .\* -Filter $pattern -Recurse | 
        Where-Object {$_.Name -notlike ($_.Directory.Name + '*')} | 
        Rename-Item -NewName {$_.Directory.Name + '-' + $_.Name}
        # Select-Object -Property Directory,Name,@{Name = 'NewName'; Expression= {$_.Directory.Name + '-' + $_.Name}}
}

https://Gist.github.com/kmpm/4f94e46e569ae0a4e688581231fa9e

0
kmpm

@ ofer.shefferの回答に基づいて、これは接尾辞を追加するためのCMDバリアントです(これは質問ではありませんが、接辞を検索した場合、このページは依然としてGoogleで一番の結果です)。拡張のため、少し異なります。

for %a in (*.*) do ren "%~a" "%~na-affix%~xa"

「-affix」部分を変更できます。

0
roverv