コンテンツへスキップ

【PowerShell】ファイル名を一括処理で連番の名前に変更する。

コマンドプロンプトだと、バッチファイルにしないといけないから、
PowerShell ならささっとファンクションを書いて実行できるのではと。

ファイル名を一括処理で連番の名前に変更する。

リネーム用スクリプト

PowerShell にコピぺすると、test、test2 ファンクションが使えるようになります。

カレントフォルダ内のファイルのみを全部「img_連番.拡張子」にします。
ファイルの種類は気にしてないので、ファイルの種類ごとにリネームしたい場合は、
Get-ChildItem のフィルタを変更、またはIF 文を挿入して拡張子を判別するようにしてください。
あと、実行場所にはくれぐれも気を付けてね^^

function test {
	$number = 1
	Get-ChildItem -File | ForEach-Object {
		$NameString = "img_" + $number.ToString("0000")+ $_.Extension
		$number++
		Rename-Item $_.Name -NewName $NameString
	}	
}

JPG ファイルだけリネームする場合。

function test {
	$number = 1
	Get-ChildItem ./*.jpg | ForEach-Object {
		$NameString = "img_" + $number.ToString("0000")+ $_.Extension
		$number++
		Rename-Item $_.Name -NewName $NameString
	}	
}

ファイル名はそのままで、拡張子の前に番号を挿入します。
拡張子なしのファイルは無視します。

function test2 {
	$number = 1
	Get-ChildItem -File | ForEach-Object {
		$dot = $_.Name.IndexOf(".")
		if( $dot -gt -1 ){
			$NameString = $_.Name.Insert( $dot, "_" + $number.ToString("0000"))
			$number++
			Rename-Item $_.Name -NewName $NameString
		}
	}
}

PowerShell の呼び出し。

エクスプローラーから呼び出すと、そのフォルダがカレントディレクトリになるので便利です。
また、以前は「コマンドプロンプトを開く」だったけど、現在はPowerShell っす。

フォルダを選択した状態で行うと、そのフォルダがターゲットになります。
必ず、プロンプトで確認してください。

フォルダをシフトキー押しながら右クリックでもこのメニューが出せます。

以下、作るにあたっての四苦八苦

function func{ }で処理を書いておけば、一括処理として呼び出せることは知っているので、
具体的にどうやって書けばいいかを考えていきます。

> function test {
>>  Get-ChildItem -Path ./
>> }

結構いきなり正解っぽいのをもってきてくれました。

ただ、サンプルコードを貼るだけでは応用が利かないし、
どちらにしろ、うまく動かんかったし。

あと、スクリプトっぽく書きたい。

単に「Get-ChildItem」をスクリプトに組み込んで連続処理しようとしても、
Get-ChildItem の処理は単独でファイル一覧を取得してしまう。

そこでパイプを使うと、ファイルを一つ取り込むごとにパイプ先の処理を実行するようになって、
結果的にファイルの数だけループ処理する感じになる。

しかし下記のテストコードはエラーに。(※$_ は渡されたオブジェクト)

Get-ChildItem | echo $_

そこで、Get-ChildItem をパイプで使うときのことを聞いてみる。

なるほど、いったん「ForEach-Object 」に渡せばいいのか。

function test{
>> Get-ChildItem | ForEach-Object {
>> echo "------------" $_.name "------------" }
>> }

そのほかのパーツについても確認。

変数の使い方。

文字列の結合も。

なるほど。じゃあ、こんな感じで。

function test {
	$number = 1
	Get-ChildItem | ForEach-Object {
		$NameString = "img_" + $number.ToString("0000")+ $_.Extension
		$number++
		Rename-Item $_.Name -NewName $NameString
	}	
}

でも、このコードだとフォルダも一緒に連番にリネームするから、、、
フォルダを取得しないように修正。

function test {
	$number = 1
	Get-ChildItem -File | ForEach-Object {
		$NameString = "img_" + $number.ToString("0000")+ $_.Extension
		$number++
		Rename-Item $_.Name -NewName $NameString
	}	
}

ついでに拡張子の前にナンバリングを挿入するバージョンも

ファイル名の後ろにナンバリングだけ追加する感じのやつも作っておこう。

文字列操作はどんなのがありますか?

検索と、挿入があればいいよね。

挿入ってどんな感じ?

拡張子がなかった場合に何がおきるかわからないから、
拡張子のある・なしの判定もいれないとね。

演算子でハマる。

function test2 {
	$number = 1
	Get-ChildItem -File | ForEach-Object {
		$dot = $_.Name.IndexOf(".")
		if( $dot -gt -1 ){
			$NameString = $_.Name.Insert( $dot, "_" + $number.ToString("0000"))
			$number++
			Rename-Item $_.Name -NewName $NameString
		}
	}
}

これだけ作っておけば、応用しやすいよね。

以上です。

(Visited 546 times, 1 visits today)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です