ファイル名を一括して先頭10文字に短くするバッチ

もうだいぶ前の記事にコメントをいただいてました。

ファイル名を特定の文字までを削除したい(ファイル名の先頭から最初に見つかった特定の文字までを削除する) - バッチもん研究所 blogのコメント欄

saltvalley さんのコメント

DOS窓でファイル名を短くするバッチを考えてて、ここに辿りつきました。
ここに書かれている特定の文字まで削除、ではなくて、もっと単純に、先頭から10文字までを残して、それ以降を削除する、ということを考えてます。つまり、長いファイル名のファイルを短いファイル名にリネームしたいだけです。
もし、簡単なやり方をご存知でしたらご教示頂ければと思います。バッチの中でsedawkを使っても結構です。

ある環境変数の先頭から10文字を取り出すには、次のように記述することが出来ます。
%環境変数名:~取り出す位置(先頭が0),取り出す文字数%

set string=abcdefghijklmn
set str=%string:~0,10%
echo %str%

の結果は

C:\>set string=abcdefghijklmn

C:\>set str=%string:~0,10%

C:\>echo %str%
abcdefghij

C:\>

となります。

ファイル名の先頭から10文字までを残してそれ以降を削除する(拡張子は含みません)バッチは次のようになります。

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

:sub
set fname=%~n1
set fname=%fname:~0,10%
ren %1 "%fname%%~x1"
goto :EOF

ファイル名を10文字まで短くすることで、他のファイルとファイル名が重複してしまうなどのエラーの回避処理は全くしてませんので、その場合は次のようなエラーが出てリネームされません。

重複するファイル名が存在するか、またはファイルが
見つかりませんでした。