SQLの窓

2014年06月19日


バッチファイル : ファイル順のシャッフル

とりあえず、mp3 のシャッフルしか用途が思いつかないですが・・・。ま、何かに使えるでしょう。

?%%j==? の ? は、空白文字列の判断用で、ファイル名に使え無い文字を使っています。( %%j は、ファイル名なので )。別に "%%j"=="" でもいいのですが、"%%j"=="" の "" は言語的なものでは無いという事を忘れないようにというメモ的な意味もあります
@echo off
REM ******************************
REM シャッフルバッチ
REM 区切り文字が @ の場合
REM sf *@*.* @
REM ------------------------------
REM 使用例 : sf *.mp3 @
REM 削除   : sf *.mp3 @ RESET
REM ******************************
for /f "tokens=1,2* delims=%2" %%i in ( 'dir /b %1' ) do (
	if ?%%j==? (call :random_ren_first "%%i" %2) else (call :random_ren "%%i%2%%j" "%%j" %2 %3)
)

goto end

:random_ren_first
ren %1 %RANDOM%%2%1
exit /b

:random_ren
if "%4"=="RESET" (ren %1 %2) else (ren %1 %RANDOM%%3%2)
exit /b

:end

for /f の意味

in ( 文字列 ) の、文字列が ' で挟まれている場合は、その中のコマンドの結果が対象。
in ( 文字列 ) の、文字列が " で挟まれている場合は、" に挟まれた文字列が対象
in ( 文字列 ) の、文字列が 普通の文字列の場合は、該当するファイルを探してその内容を対象( ファイル名は、スペースやカンマで繋げて複数のファイルを対象にできる )

for 内で繰り返される内容

/f の後のオプションが無ければ、対象を行単位で取り込んで、スペースまたはタブで区切った先頭の文字列を取得して %%i にセットする。

ここでは、"tokens=1,2* delims=%2" というオプションがセットされているので、%%i に一番目のトークンをセットし、%%j ( 暗黙で以降の変数はアルファベット順 ) に2番目以降全ての文字列がセットされます(*がなければ、2番目のみ)。その際の区切り文字として、delims= の右辺が使用されるので、ここではバッチファイルに渡される2番目の引数を使います。( サンプルとしては、ここでは @ という文字を想定しています )

つまり、実行結果が以下のように処理されます。
abc.txt の場合、%%i が abc.txt で、%%j が 空文字
123@abc.txt の場合、%%i が 123 で、%%j が abc.txt
if ?%%j==? の意味は %%j が空文字になると、? == ? という比較になるので、一致する事になります。ですから、%%j に何か入っておれば、 else の処理で、それは元々の文字列に @ が含まれているという事で、一度シャッフル済みだという事になります。 %%j が空文字の場合は、初めての処理になるので :random_ren_first へジャンプして ランダム数値@元のファイル名というフォーマットに変更します。このフォーマットを守れば、バッチファイルの第3引数に RESET を指定すると元のファイル名に戻す事ができます。



posted by lightbox at 2014-06-19 22:20 | コマンド : バッチファイル | このブログの読者になる | 更新情報をチェックする
バッチ処理

Microsoft Office
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
CSS ドロップシャドウの参考デモ
Google Hosted Libraries
cdnjs
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり