ファイル名を特定の文字までを削除したい(ファイル名の先頭から最初に見つかった特定の文字までを削除する)

OKWave から。ファイル名の先頭から特定の文字までを削除したい、フリーソフトを探していますという相談。フリーソフトではなくバッチで考えてみました。

質問者:xykatakaak ファイル名を特定の文字までを削除したい

「23564_abcdef_1a2b3c」というような「_」で繋いだ文字列のファイル名を、最初の「_」までを、その「_」自身も含めて削除したいのです。
最初の「_」までの文字の数はまちまちで、かなりの数のファイルを処理したいのです。

このようなリネームが出来るフリーソフトはあるでしょうか?(シェアウェアでもかまわないのですが)

http://okwave.jp/qa4763716.html

シェアウェアどころかバッチでできちゃいます。シェアウェアに払ったつもりでかわりにおごってください ;-P


以下が先頭から"_"までを取り除くバッチです。


"_"が入っていないファイル名、"_"が最後にあるファイル名は無視します(何もしない)。
"_"が連続する場合やフィアル名の途中に"."が複数ある様な特殊な場合は考慮していません(ややこしいので)。

このバッチを処理したいファイルのあるフォルダに置いて実行します。
ここでは対象はフォルダ内の全ファイルですが、例えばテキストファイルだけにしたければ2行目の
for /F "delims=" %%f in ('dir /b') do call :sub "%%f"

for /F "delims=" %%f in ('dir /b *.txt') do call :sub "%%f"
という風に変えればOKです。

:--------------------------------------------------- loop.bat
echo off
for /F "delims=" %%f in ('dir /b') do call :sub "%%f"
exit /b

:sub
set fname=%~1
set n=0

:loop
   call set c=%%fname:~%n%,1%%
   set /a n=n+1
   if "%c%"=="" goto :EOF
   if "%c%"=="_"  goto break
goto loop
:break
call set newname=%%fname:~%n%%%
if "%newname%"=="" goto :EOF
if "%newname:~0,1%"=="." goto :EOF
ren "%fname%" "%newname%"
goto :EOF

一文字ずつ順番に比較する地道なバッチです。
call set c=%%fname:~%n%,1%%
のところで、部分文字列の指定に変数を使うための小細工をしています。
昔だったら一時ファイルを作っていただろうなぁ。