- ベストアンサー
バッチファイルで画像ファイル名の頭文字を削除したい
一括で、画像のファイル名の頭4文字を削除したいと思っています。 拡張子はJPGで、バッチで作成しています。 ほぼ、うまく動いているのですが、 1つ目の画像ファイルだけが、8文字削除されてしまいます。 どこが間違えているのかが分からなくて、 ご教授いただけますでしょうか。 よろしくお願いいたします。 @echo off setlocal enabledelayedexpansion for %%F in (*.jpg *.png *.gif *.bmp) do ( set "filename=%%~nF" set "extension=%%~xF" rem ファイル名が4文字以上の場合にのみ先頭4文字を削除 if "!filename:~4!" neq "" ( set "tempname=!filename:~4!!extension!" rem ファイル名が元の名前と異なる場合のみリネーム if not "!tempname!"=="%%F" ( ren "%%F" "!tempname!" ) ) else ( echo ファイル名が短すぎて変更できません: "%%F" ) ) endlocal
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ごめんなさい。1つ前の訂正。 @echo off setlocal enabledelayedexpansion for /f "delims=" %%F in ('dir /b /a-d *.jpg *.png *.gif *.bmp') do ( set filename=%%~nF set extension=%%~xF rem ファイル名が4文字以上の場合にのみ先頭4文字を削除 if "!filename:~4!" neq "" ( set "tempname=!filename:~4!!extension!" rem リネーム後のファイル名が存在しない場合のみリネーム if not exist "!tempname!" ( ren "%%F" "!tempname!" ) ) else ( echo ファイル名が短すぎて変更できません: "%%F" ) )
その他の回答 (3)
- UY-Scuti
- ベストアンサー率85% (17/20)
このままでは、重複してしまうようです。以下に訂正。 @echo off setlocal enabledelayedexpansion for %%F in (*.jpg *.png *.gif *.bmp) do ( set "filename=%%~nF" set "extension=%%~xF" rem ファイル名が4文字以上の場合にのみ先頭4文字を削除 if "!filename:~4!" neq "" ( set "tempname=!filename:~4!!extension!" rem リネーム後のファイル名が存在しない場合のみリネーム if not exist "!tempname!" ( ren "%%F" "!tempname!" ) ) else ( echo ファイル名が短すぎて変更できません: "%%F" ) ) -------------------------------------------------- ちなみに、PowerShell だと・・・ PowerShell ですが、1行目のおまじないを付けるとバッチファイルとして実行できます。2行目からが 純粋な PowerShell の記述です。 @powershell -c "'#'+(gc '%~f0' -Raw) | iex" &exit/b (ls *.jpg,*.png,*.gif,*.bmp) | % { if($_.BaseName.Length -ge 4){ $_ } else { Write-Host ファイル名が短すぎて変更できません: $_.Name } } | % { if(!(Test-Path $_.Name.Substring(4))){$_} } | ren -new {$_.Name -replace '^.{4}'}
- UY-Scuti
- ベストアンサー率85% (17/20)
>これでは、変数の有無をチェック出来ません。 ごめんなさい。 "" で括ると出来るみたいですね。
- UY-Scuti
- ベストアンサー率85% (17/20)
setlocal enabledelayedexpansion for /f "delims=" %%F in ('dir /b /a-d *.jpg *.png *.gif *.bmp') do ( set filename=%%~nF set extension=%%~xF rem ファイル名が4文字以上の場合にのみ先頭4文字を削除 set STR=!filename:~4! if defined STR ( set tempname=!filename:~4!!extension! rem ファイル名が元の名前と異なる場合のみリネーム if not "!tempname!"=="%%F" ( ren "%%F" "!tempname!" ) ) else ( echo ファイル名が短すぎて変更できません: "%%F" ) ) --------------------------------------------- バッチファイルでやるんだ・・・・。 PowerShell を混ぜた方が楽だと思うけど・・・。 >ファイル名が4文字以上の場合にのみ先頭4文字を削除 if "!filename:~4!" neq "" ・・・ これでは、変数の有無をチェック出来ません。 http://scripting.cocolog-nifty.com/blog/2009/05/post-4ed4.html
お礼
問題なく出来ました。 有難うございました。助かりました。