ファイルの名前の前に、親フォルダの名称を自動的に付ける

OKWave からフリーソフトを探していますという相談。これをバッチで実現してみます。
http://okwave.jp/qa4545395.html

質問者:rack-an ファイルの名前の前に、親フォルダの名称を自動的に付けるフリーソフト

親フォルダの名前を、そのフォルダ内の各ファイルに自動で追加リネームできるフリーソフトを探しています。ご存じの方がいらっしゃいましたらお願いします。

例:
【変換前】
<親フォルダ>   <ファイル群>
ABCD-4567-XY  ┬  01_photo.jpg
        ├  02_photo.jpg
        └  03_photo.jpg

【変換後】
<親フォルダ>   <ファイル群>
ABCD-4567-XY  ┬  ABCD-4567-XY_01_photo.jpg
        ├  ABCD-4567-XY_02_photo.jpg
        └  ABCD-4567-XY_03_photo.jpg

何卒よろしくお願いします。

http://okwave.jp/qa4545395.html

引数に該当するフォルダや該当するフォルダ内の1ファイルを指定するとします。
この方が便利だと思ったのだが、これが意外と手こずる原因になってしまいました。
素直に引数にはフォルダを指定するだけならもう少し簡単になっていたと思います。
dir /a:d 云々のところが引数がフォルダ指定なのかファイル指定なのかを判断している所です。ファイルを指定して場合は、一旦ファイルのディレクトリに移動して、%CD%でディレクトリのフルパスを取得して自分自身を呼び出しています。なんでこんなまどろっこしい事をしているかというと、%~dp1では最後に"\"が付いてしまうためこれを取り除くための苦肉の策です。

環境変数pnameには指定したフォルダのパスが、環境変数nameにはフォルダ名が入ります。
あとは、for文でフォルダ内のファイルに対して、リネームを行います。

"%%f"にはファイルのフルパスが入ります。
"%name%_%%~nxf" で"フォルダ名_ファイル名(拡張子付き)"となります。

for文の in ("%pname%"\*) → in ("%pname%"\*.jpg) 等とすると拡張子がjpgのファイルのみリネームするようなことも可能です。

echo off
:--------------------------------------------------- sample.bat
if "%~1"=="" goto usage
  dir /a:d "%~1">NUL 2>&1
  if %errorlevel% EQU 0 goto top
:    ファイルを指定した場合
     pushd "%~dp1"
     "%~f0" "%CD%"

:パスとフォルダ名を取得
:top
set pname=%~f1
set name=%~nx1

for /f "delims=" %%f in ('dir /b "%pname%"') do ren "%pname%\%%f" "%name%_%%f"

goto :EOF

:usage
echo usage: %0 folder or file
echo リネームしたいファイルの入っているフォルダや該当するフォルダ内の1ファイルを指定します。