• ベストアンサー

バッチファイルで画像ファイル名の頭文字を削除したい

一括で、画像のファイル名の頭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

質問者が選んだベストアンサー

  • ベストアンサー
  • UY-Scuti
  • ベストアンサー率85% (17/20)
回答No.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" ) )

s52i4z9
質問者

お礼

問題なく出来ました。 有難うございました。助かりました。

その他の回答 (3)

  • UY-Scuti
  • ベストアンサー率85% (17/20)
回答No.3

このままでは、重複してしまうようです。以下に訂正。 @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)
回答No.2

>これでは、変数の有無をチェック出来ません。 ごめんなさい。 "" で括ると出来るみたいですね。

  • UY-Scuti
  • ベストアンサー率85% (17/20)
回答No.1

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

関連するQ&A