Stable Diffusionの.batファイル run.bat webui-user.bat webui.batの違い

batファイルとは

batファイルは、コマンドプロンプトなどでコマンドを実行するように命令を記述されたファイルです。

それぞれのファイルの違い

ところでStable Diffusionのインストールや設定など、情報によっては
  • un.bat
  • webui-user.bat
など実行するファイルが異なったりするみたいなので、一体何が違うのか実際中身を見てみましょう。

run.bat

@echo off

call environment.bat

cd %~dp0webui
call webui-user.bat

run.batは単純です。

@echo off
@echo offは、コマンドプロンプトなどのCLI上で、コマンドを表示せずに結果だけを表示する命令で、よく使われます。

call environment.bat
environment.batファイルを呼び出します。

cd %~dp0webui
ディレクトリをwebuiに変更します。

call webui-user.bat
webui-user.batファイルを呼び出します。

environment.bat

@echo off

set DIR=%~dp0system

set PATH=C:\Windows\system32;C:\Windows;%DIR%\git\bin;%DIR%\python;%DIR%\python\Scripts
set PY_LIBS=%DIR%\python\Scripts\Lib;%DIR%\python\Scripts\Lib\site-packages
set PY_PIP=%DIR%\python\Scripts
set SKIP_VENV=1
set PIP_INSTALLER_LOCATION=%DIR%\python\get-pip.py
set TRANSFORMERS_CACHE=%DIR%\transformers-cache

environment.batもシンプルです。

set 〇〇
setは変数を設定します。

各変数は後に使われたりします。

PYはPythonの略、LIBSはライブラリ、PIPはPythonの管理パッケージ、VENVはPythonが動作する仮想環境Virtual Environmentの略です。

webui-user.bat

@echo off

set PYTHON=
set GIT=
set VENV_DIR=
set COMMANDLINE_ARGS=--xformers --autolaunch

call webui.bat

webui-user.batもシンプルです。

call webui.bat
webui.batファイルを呼び出します。

変数を設定しておいてwebui.batファイルを呼び出すだけです。

webui.bat

@echo off

if not defined PYTHON (set PYTHON=python)
if not defined VENV_DIR (set "VENV_DIR=%~dp0%venv")


set ERROR_REPORTING=FALSE

mkdir tmp 2>NUL

%PYTHON% -c "" >tmp/stdout.txt 2>tmp/stderr.txt
if %ERRORLEVEL% == 0 goto :check_pip
echo Couldn't launch python
goto :show_stdout_stderr

:check_pip
%PYTHON% -mpip --help >tmp/stdout.txt 2>tmp/stderr.txt
if %ERRORLEVEL% == 0 goto :start_venv
if "%PIP_INSTALLER_LOCATION%" == "" goto :show_stdout_stderr
%PYTHON% "%PIP_INSTALLER_LOCATION%" >tmp/stdout.txt 2>tmp/stderr.txt
if %ERRORLEVEL% == 0 goto :start_venv
echo Couldn't install pip
goto :show_stdout_stderr

:start_venv
if ["%VENV_DIR%"] == ["-"] goto :skip_venv
if ["%SKIP_VENV%"] == ["1"] goto :skip_venv

dir "%VENV_DIR%\Scripts\Python.exe" >tmp/stdout.txt 2>tmp/stderr.txt
if %ERRORLEVEL% == 0 goto :activate_venv

for /f "delims=" %%i in ('CALL %PYTHON% -c "import sys; print(sys.executable)"') do set PYTHON_FULLNAME="%%i"
echo Creating venv in directory %VENV_DIR% using python %PYTHON_FULLNAME%
%PYTHON_FULLNAME% -m venv "%VENV_DIR%" >tmp/stdout.txt 2>tmp/stderr.txt
if %ERRORLEVEL% == 0 goto :activate_venv
echo Unable to create venv in directory "%VENV_DIR%"
goto :show_stdout_stderr

:activate_venv
set PYTHON="%VENV_DIR%\Scripts\Python.exe"
echo venv %PYTHON%

:skip_venv
if [%ACCELERATE%] == ["True"] goto :accelerate
goto :launch

:accelerate
echo Checking for accelerate
set ACCELERATE="%VENV_DIR%\Scripts\accelerate.exe"
if EXIST %ACCELERATE% goto :accelerate_launch

:launch
%PYTHON% launch.py %*
pause
exit /b

:accelerate_launch
echo Accelerating
%ACCELERATE% launch --num_cpu_threads_per_process=6 launch.py
pause
exit /b

:show_stdout_stderr

echo.
echo exit code: %errorlevel%

for /f %%i in ("tmp\stdout.txt") do set size=%%~zi
if %size% equ 0 goto :show_stderr
echo.
echo stdout:
type tmp\stdout.txt

:show_stderr
for /f %%i in ("tmp\stderr.txt") do set size=%%~zi
if %size% equ 0 goto :show_stderr
echo.
echo stderr:
type tmp\stderr.txt

:endofscript

echo.
echo Launch unsuccessful. Exiting.
pause

一番メインのbatファイルです。

では順番に見ていきます。

if not defined 〇〇
定義されてなければ定義します。

mkdir tmp 2>NUL
既にtmpファイルがある場合エラーを出さずに、tmpファイルがなければ作成します。

%PYTHON% -c "" >tmp/stdout.txt 2>tmp/stderr.txt
一旦空のコードを実行し、標準出力と標準エラー出力をそれぞれ 「tmp/stdout.txt」と「tmp/stderr.txt」に書き込みます。

%PYTHON%
上記で定義された変数です。

-c ""
python -cオプションは、簡単なPythonのスクリプトを実行します。

""は、空のコードを実行します。

つまり、何もしないPythonの実行が行われます。

>tmp/stdout.txt
標準出力を 「tmp/stdout.txt」に書き込みます。

2>tmp/stderr.txt
標準エラー出力を「tmp/stderr.txt」ファイルに書き込みます。

if %ERRORLEVEL% == 0 goto :check_pip
直前(一行上の命令)のエラーがなければ、check_pipに進みます。

エラーがあれば、
Couldn't launch python
と出力して、show_stdout_stderrに進みます。

:check_pip ラベル

:はラベルと言います。

主にgotoによってこのラベルに飛ばされます。

%PYTHON% -mpip --help >tmp/stdout.txt 2>tmp/stderr.txt
同じように、pipモジュールの有無を確認するために、ヘルプがなければエラーを出しています。

-mはモジュールで、ここではPythonのpipモジュールを指定しています。

if %ERRORLEVEL% == 0 goto :start_venv
直前でエラーがなければstart_venvに進みます。

if "%PIP_INSTALLER_LOCATION%" == "" goto :show_stdout_stderr
pipのインストーラがなければshow_stdout_stderrに進みます。

%PYTHON% "%PIP_INSTALLER_LOCATION%" >tmp/stdout.txt 2>tmp/stderr.txt
インストーラがあればインストールしてみます。

if %ERRORLEVEL% == 0 goto :start_venv
エラーがなければstart_venvに進みます。

echo Couldn't install pip
goto :show_stdout_stderr

で、エラーがあればCouldn't install pipと出力してshow_stdout_stderrに進みます。

:start_venv ラベル

前述の仮想環境Virtual Environmentです。

if ["%VENV_DIR%"] == ["-"] goto :skip_venv
VENV_DIR変数が「-」ならskip_venvに進みます。

if ["%SKIP_VENV%"] == ["1"] goto :skip_venv
SKIP_VENV変数が「1」ならskip_venvに進みます。

dir "%VENV_DIR%\Scripts\Python.exe" >tmp/stdout.txt 2>tmp/stderr.txt
Python.exeを試みます。

if %ERRORLEVEL% == 0 goto :activate_venv

エラーがなければactivate_venvに飛びます。

エラーがあれば、エラーメッセージを出力して、show_stdout_stderrに進みます。

エラーがなければ、仮想環境のディレクトリを求めて、問題なければactivate_venvに進みます。

問題があればshow_stdout_stderrに進みます。

:activate_venv ラベル

set PYTHON="%VENV_DIR%\Scripts\Python.exe"
echo venv %PYTHON%

PYTHON変数に代入して表示します。

:skip_venv ラベル

ACCELERATEがTrueであれば、accelerateに進みます。
Trueでなければlaunchに進みます。

:accelerate ラベル

accelerateのexeファイルが存在すれば、accelerate_launchに進みます。

:launch ラベル

launch.pyを実行して終了し、「続行するには何かキーを押してください...」とメッセージを出します。

:accelerate_launch ラベル

高速化アクセラレーターを使うように実行して終了し、「続行するには何かキーを押してください...」とメッセージを出します。

:show_stdout_stderr ラベル

「echo.」で一行空けて、直前のエラーを出力します。

for /f %%i in ("tmp\stdout.txt") do set size=%%~zi
この行は、tmp\stdout.txtというファイルのサイズを取得し、sizeという変数に代入しています。

%%iは一時的な変数であり、%%~ziは%%iが指すファイルのサイズを表します。

if %size% equ 0 goto :show_stderr
この行は、sizeの値が0と等しい場合には、show_stderrに進みます。

echo.
echo stdout:
type tmp\stdout.txt

これらの行は、改行を出力し、stdout:というテキストを表示し、tmp\stdout.txtの内容を表示します。
echoコマンドはテキストを表示し、typeコマンドは指定されたファイルの内容を表示します。

:show_stderr ラベル

こちらも同じように、もしtmp\stderr.txtが存在し、そのサイズが0バイトでない場合には、その内容を表示し、もしファイルが存在しないか、サイズが0バイトであれば、エラーメッセージを表示します。

:endofscript ラベル

改行してメッセージを出力し、「続行するには何かキーを押してください...」と表示します。

update.bat

@echo off

call environment.bat

git -C "%~dp0webui" pull 2>NUL
if %ERRORLEVEL% == 0 goto :done

git -C "%~dp0webui" reset --hard
git -C "%~dp0webui" pull

:done
pause

call environment.bat

environment.batを呼び出します。

git -C "%~dp0webui" pull 2>NUL
if %ERRORLEVEL% == 0 goto :done

この部分は、Gitコマンドを使用して指定されたディレクトリ(`"%~dp0webui"`)のリポジトリから最新の更新を取得します。

2>NULは、エラーメッセージの出力を抑制するために使用されます。

%ERRORLEVEL%は、前のコマンドの終了コードを表します。

もし終了コードが0であれば(成功した場合)、doneにジャンプします。

git -C "%~dp0webui" reset --hard
git -C "%~dp0webui" pull

もし前のコマンドでエラーが発生した場合は、この2行が実行されます。

これらの行は、リポジトリをハードリセットして最新の状態に戻し、再度更新の取得を試みます。

:done ラベル

:done
pause

if文が正常に終了した場合、またはリポジトリのリセットとプルが行われた場合、このラベルにジャンプし、「続行するには何かキーを押してください...」と表示します。

分かったこと

run.batではenvironment.batを経由するが、webui-user.batだと経由しない。

pipモジュールは自動でここでインストールしている。

[カテゴリ]

2023年06月23日

関連記事

AIイラスト界隈でも、絵師さんのような絵柄のイラストをあげている人が多くなってきましたね...

2024年10月27日

個人的にマウスコンピューター推しなので、今回はマウスコンピューターのパソコンについてま...

2023年05月14日

今回は、StableDiffusionのローカル環境でSDXLを使用する方法についてまとめていきます。...

2024年06月05日

さて今回は、StableDiffusionをスマホで使う方法について書いて行こうと思います。...

2023年04月26日

今回は、StableDiffusionWebUIをローカルのパソコンにインストールする方法を書き留めて行...

2023年05月26日

Copyright© 2024-2025 ai-illust.art All Rights Reserbed.

当サイトに掲載している文章、画像などの無断転載を禁止いたします。