コマンドプロンプトだと、バッチファイルにしないといけないから、
PowerShell ならささっとファンクションを書いて実行できるのではと。
ファイル名を一括処理で連番の名前に変更する。
Contents
リネーム用スクリプト
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 ./
>> }
スクリプトについてはBing に聞く。
結構いきなり正解っぽいのをもってきてくれました。
ただ、サンプルコードを貼るだけでは応用が利かないし、
どちらにしろ、うまく動かんかったし。
あと、スクリプトっぽく書きたい。
基本的な構文はGet-ChildItem -Path <フォルダパス>です。
Pathパラメータを省略すると、カレントフォルダの内容を表示します。
単に「Get-ChildItem」をスクリプトに組み込んで連続処理しようとしても、
Get-ChildItem の処理は単独でファイル一覧を取得してしまう。
そこでパイプを使うと、ファイルを一つ取り込むごとにパイプ先の処理を実行するようになって、
結果的にファイルの数だけループ処理する感じになる。
しかし下記のテストコードはエラーに。(※$_ は渡されたオブジェクト)
Get-ChildItem | echo $_
そこで、Get-ChildItem をパイプで使うときのことを聞いてみる。
Get-ChildItemの出力をForEach-Objectにパイプすると、各項目に対して任意の処理を実行できます。
例えば、Get-ChildItem | ForEach-Object {Get-Content $_.FullName}とすると、各ファイルの中身を表示します。
なるほど、いったん「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
}
}
}
これだけ作っておけば、応用しやすいよね。
以上です。