【Gemma4】ファイルサイズ151KB以上だけsaveフォルダーに年別に移動する.batをGemma4で自動作成!

目次

水曜夜間に実行するUWSC:出馬表自動作成のExcelファイルを移動したい

昨年、バンコクでのUWSC作成で現在、水曜日の夜中に自動実行しているJRA競馬の出馬表作成で、そろそろフォルダーにファイルが溜まってきたので、これをファイルサイズ151KB以上だけ配下のsaveファルダーに年別に移動するバッチファイルを作成した。当初はコマンドプロンプト一行を調べて、それをUWSCでプログラミングする予定だったが、最近インストールしたGemma4 26Bにコマンドプロンプトをお願いしたところ、一度目は保存がUTF8だったのでエラーが出たが、メモ帳でANSIに修正し再実行でコマンドラインそのものは一発で起動した!素晴らしい。

先に、元になる出馬表自動作成は別記事で公開中ですので、コチラを先にご覧頂くと、これ以降の記事がそれなりに理解できると思います。🙏

https://adono-baken.xyz/bakengaku-1512

ollamaで「Gemma4 26B」を起動し、cmd(コマンドプロンプト)作成

初回はこんな感じで聞きました。

Q:windows CMDでファイル名の前から4文字が西暦を表している場合、ひとつ下のフォルダー(例えば2026)があればそこへファイルを移動し、もしフォルダーがなければフォルダーを作成してからファイルを移動するというCMDは書けますか?

Ans:はい、Windowsのバッチファイル(.bat)を作成することで、ご希望の動作を実現可能です。

@echo off
setlocal enabledelangedexpansion

echo ファイルの整理を開始します...

rem カレントディレクトリのすべてのファイルをループ処理
for %%F in (*.*) do (
    rem 実行中のバッチファイル自身は処理対象から除外
    if not "%%F"=="%~nx0" (
        
        rem ファイル名を取得
        set "filename=%%F"
        
        rem ファイル名の先頭4文字を抽出
        set "year=!filename:~0,4!"
        
        rem 抽出した4文字が数字かどうかを簡易的にチェック(4文字目が数字なら移動)
        rem ※ここでの判定は「4文字目が数字か」をチェックする簡易的なものです
        set "fourth_char=!filename:~3,1!"
        
        rem 数字の判定(0-9)
        echo !fourth_char!| findstr "[0-9]" >nul
        
        if !errorlevel! == 0 (
            rem フォルダが存在するか確認し、なければ作成
            if not exist "!year!" (
                echo フォルダ "!year!" を作成します。
                mkdir "!year!"
            )
            
            rem ファイルを移動
            echo "%%F" を "!year!" フォルダへ移動中...
            move "%%F" "!year!\" >nul
        )
    )
)

echo.
echo すべての処理が完了しました。
pause

パッとみて動きそうだな~という感じだよねw

ここから、

  • ターゲットフォルダーを絶対Pathにする
  • 移動を\save配下にし年別にする
  • ファイルサイズ151KB以上のファイルのみ移動させる

といった経緯で完成させたcmdがこちら↓

@echo off
setlocal enabledelayedexpansion

rem ==========================
rem 設定:処理対象のディレクトリ(絶対パス)
rem ==========================
set "targetDir=C:\Users\あどのまつり\uwsc5302\travel\出馬表"

echo 処理対象ディレクトリ: "%targetDir%"
echo ファイルを整理し、saveフォルダへ移動します...
echo (条件: 先頭4文字が西暦 かつ 151KB以上)
echo.

rem 対象ディレクトリが存在するか確認
if not exist "%targetDir%" (
    echo [エラー] 指定されたディレクトリが見つかりません: "%targetDir%"
    pause
    exit /b
)

rem 指定されたディレクトリに移動
cd /d "%targetDir%"

rem 判定基準となるサイズ (151KB = 151 * 1024 = 154784 bytes)
set "minSize=154784"

rem カレントディレクトリ(targetDir)のすべてのファイルをループ処理
for %%F in (*.*) do (
    
    rem 実行中のバッチファイル自身は処理対象から除外
    if not "%%~nxF"=="%~nx0" (
        
        rem ファイル名を取得
        set "filename=%%~nxF"
        
        rem ファイルサイズ(バイト)を取得
        set "fsize=%%~zF"
        
        rem ファイル名の先頭4文字を抽出
        set "year=!filename:~0,4!"
        
        rem 4文字目が数字かどうかをチェック
        set "fourth_char=!filename:~3,1!"
        echo !fourth_char!| findstr "[0-9]" >nul
        
        rem 4文字目が数字の判定が成功かつ、サイズが基準以上の場合
        if !errorlevel! == 0 (
            if !fsize! GEQ !minSize! (
                
                rem 移動先のパスを 「save\YYYY」 に設定
                set "destDir=save\!year!"
                
                rem 保存先フォルダが存在するか確認し、なければ作成
                if not exist "!destDir!" (
                    echo フォルダ "!destDir!" を作成します。
                    mkdir "!destDir!"
                )
                
                rem ファイルを移動
                echo "%%F" [!f5ize! bytes] を "!destDir!\" へ移動中...
                move "%%F" "!destDir!\" >nul
            )
        )
    )
)

echo.
echo すべての処理が完了しました。
rem ここにあった pause を削除しました。

まぁあれだよ!一発で動くのは素晴らしいよ。コングラッチレーション。ブラボー。トレビア~ンだよw

上記cmdのフローチャート

graph TD
    Start([開始]) --> SetVar[設定: ターゲットDIR / 最小サイズ151KB]
    SetVar --> CheckDir{ディレクトリ存在チェック}
    
    CheckDir -- 存在しない --> Error[エラー表示] --> End([終了])
    
    CheckDir -- 存在する --> MoveDir[対象ディレクトリへ移動]
    MoveDir --> LoopStart{フォルダ内の全ファイルをループ}
    
    LoopStart -- ファイルがある --> ExcludeSelf{自身を対象外にする?}
    ExcludeSelf -- Yes --> GetInfo[ファイル名・サイズ・先頭4文字を取得]
    ExcludeSelf -- No --> LoopStart
    
    GetInfo --> CheckName{先頭4文字目は数字?}
    CheckName -- Yes --> CheckSize{サイズ >= 151KB?}
    CheckName -- No --> LoopStart
    
    CheckSize -- Yes --> CheckFolder{save/YYYY フォルダはある?}
    CheckSize -- No --> LoopStart
    
    CheckFolder -- ない --> MkDir[フォルダ作成] --> MoveFile[ファイルを移動]
    CheckFolder -- ある --> MoveFile
    
    MoveFile --> LoopStart
    
    LoopStart -- 全ファイル完了 --> Finish[完了表示] --> End

上記cmdのPAD(論理構造図)

プログラムの階層構造を整理した図解です。

構造処理内容
初期設定1. targetDir の設定
2. minSize (154,784 byte) の設定
事前判定targetDir が存在しない場合:エラー表示して終了
反復 (Loop)対象ディレクトリ内のすべてのファイルに対して実行:
 ├ 選択バッチファイル自身ではない場合:
 │ └ 実行1. ファイル名・サイズ・先頭4文字を取得
2. 4文字目が数字か判定
 │  └ 選択数字 かつ サイズが151KB以上 の場合:
 │   └ 実行1. 移動先パス save\西暦 を決定
2. フォルダがなければ mkdir で作成
3. move コマンドでファイルを移動
終了処理完了メッセージを表示

図解のポイント

  • フィルタリング: 「自分自身を除外」「名前の4文字目が数字」「サイズが151KB以上」という3重のフィルタを通ったファイルだけが移動対象になっています。
  • 自動仕分け: save\!year! の部分で、ファイル名の先頭4文字(西暦)ごとに自動でフォルダを振り分けて作成する仕組みになっています。

上記cmdをUWSCのスケジュールに組み込むため.uwsを作成

こちらも連続で、Gemma4 26Bにお願いしてみたが、さすがにコレはうまくいかなかったね。。。まぁそれでも今までの他のAiよりも、惜しい記述はしてくれたので、もう少しVRAMを増やすことが出来れば、実用可能にはなるがUWSCだけNoteBookLMにやらせても良いのかもしれないね。

まぁただ今回はcmdのバッチファイルをUWSCスケジュールに入れるための.uws一行なので、完璧なcmd作成とは逆にUWSCは私が自分で作ったほうが良いかな~といった印象だね。

UWSCスケジュールの「02出馬表作成」をPythonで書き直したら、多分一本の.pyでいけるし時間も大幅に短縮できるんだが、そこまでの.mdもしくはコンテキストを一気に読み込ませるはどのAi利用はまだしていないので、今後小刻みにGemma4やNoteBookLM、無料クラウドAiを駆使して作り上げるしかないかな~?

まぁ時間は掛かっても、目的は達成できているのだから当面はこれで良し!としておこう~

それでは、またね~( ̄▽ ̄)

目次