前ブログで 2015/03/15 に書いたWindows用ポータブル版PostgreSQLの件。デフォルトで用意されているバッチファイルは、最初のデータベース初期化+サーバ起動+ psql起動が一つになっています。通常はこれで問題ないのですが、初期化だけやり直すとか、psqlを使わずサーバの起動・終了だけしたい場合に備え、それ用のバッチを作りました。実行環境はWindows 7 32bit + PostgreSQL Portable 9.4.1。

おさらい:最初のセットアップまで
前ブログの記事と同じです。PostgreSQL Portable : Files にあるPostgreSQLPortable-9.4.1.paf.exeをダウンロードし、実行するだけ。

↓ ファイル一式の展開先を適当に指定。ポータブル版なので後で自由に移動できます。

↓ セットアップ完了画面。ここでRunにはチェックを入れず、そのまま終了させます。

デフォルトの起動用バッチファイルの確認
セットアップできたら、ひとまずデフォルトの起動用バッチの中身を確認してみます。展開先フォルダの下App/PgSQL/pgsql.cmdが ↓ それ。

このうち環境変数と、データベース初期化を行うブロックは ↓ こちら。データフォルダがなければ(二つ目の画像のように)、初期化用コマンドinitdbを起動するようになっています。
part_of_pgsql.cmdSelectRawtextBitbucket
:: This code is a part of "pgsql.cmd" in PostgreSQL Portable 9.4.1
:: URL : http://sourceforge.net/projects/postgresqlportable/files/9.4/
:: File: PostgreSQLPortable-9.4.1.paf.exe
:: By:   Gareth Flowers
:: License: MIT License

:: set up postgres variables
set PGSQL=%APPBASE%\App\PgSQL
set PGDATA=%APPBASE%\Data\data
set PGLOG=%APPBASE%\Data\log.txt
set PGLOCALEDIR=%PGSQL%\share\
set PGDATABASE=postgres
set PGUSER=postgres
set PATH=%PGSQL%\bin;%PATH%

:: initialise a new database on first use
if not exist "%PGDATA%" (
    echo.
    echo Initialising database for first use, please wait...
    "%PGSQL%\bin\initdb" -U %PGUSER% -A trust -E utf8 --locale=C >nul
)

コマンドラインツールの文字化け防止対策
まずinitdb実行だけのバッチファイルを作りますが、その前にコマンドの日本語メッセージの文字化け対策。前ブログの 「PostgreSQL 9.4 Windowspsqlの文字化けを直す」(2015/03/12)で書いたのと同じで、gettext-runtime_0.18.1.1-2_win32.zip をダウンロードし、中にあるintl.dllを解凍し ↓PostgreSQLのプログラムフォルダにコピー(二つ目の画像)。既存の同名ファイルは念のため適当にリネームして取っておきます。

データベース初期化コマンドinitdbのバッチファイル
↓ 展開先フォルダ直下に、簡単なinitdb用バッチを作りました。コマンドラインオプションの詳細は PostgreSQL 9.4.0文書: initdb -- PostgreSQLのデータベースクラスタを新しく作成する を参照。-Dのパスを変えることで、好きな場所にデータを置けます。
example_initdb.batSelectRawtextBitbucket
@echo off
"App/PgSQL/bin/initdb" -U postgres -D "Data/data" -E utf8 --locale=C
pause

↓ バッチを実行した様子。グレーの部分はWindowsのユーザ名です。特に問題が起きなければ、最後の方に「成功しました」と出てPostgreSQLの準備完了になります。

起動・終了用コマンドpg_ctlのバッチファイル
次に、起動・終了のためコマンドpg_ctlを使うバッチファイルを先ほどと同じ場所 ↓ に作成。他のBATEXEは誤って実行しないようリネームしました。コマンドのオプションは PostgreSQL 9.4.0文書: pg_ctl -- PostgreSQLサーバを初期化、起動、停止、制御する を参照。
example_pg_ctl.batSelectRawtextBitbucket
@echo off
"App/PgSQL/bin/pg_ctl" -D "Data/data" -w start

:prompt
set /p inp="サーバ停止するには Q を入力してください : "
if "%inp%"=="Q" (
    "App/PgSQL/bin/pg_ctl" -D "Data/data" -w stop
) else (
    goto :prompt
)
pause

pg_ctlで起動させるだけでは、そのコマンドプロンプトを閉じるとサーバの強制終了になります。そこでPostgreSQL Portableのデフォルトでは、起動後にpsqlを立ち上げていました。上のバッチはpsqlの代わりにコマンドプロンプトの入力待機状態 ↓ にすることで、サーバをそのままにします。

roleの所はWindowsのユーザ名で、同名のPostgreSQL用ユーザがいないというだけで、特に問題ありません。停止の合図は何でもよく、ここではQ +リターン。それ以外が入力されたら ↓ 再び入力待機状態に戻ることで、誤ってサーバを止めないようにしています。

pg_ctl起動時にログファイルを指定していないので、エラー等があれば上のコンソール内に出ます。その場合「サーバ停止するには…」のプロンプトが消え(というか表示が乱され)ますが、入力待機状態は変わっておらずQ +リターンで普通にサーバ停止できました。