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日