…というのが1コマンドで済めば便利だなと思い、既存メタコマンドに少し加えてみました。実行環境はWindows 7 64bit + PostgreSQL 9.5.0 + psql 9.5.0 + CMDシェル+ ConEmu。最後の色指定を除きConEmu依存の要素はないので、多分コマンドプロンプトでも動くと思います。
Contents


新規書き込み(ファイル既存なら上書き)の場合

これは簡単です。例えばwg1という名前の変数を ↓ のとおり定義し、クエリ文字列の後に「:wg1ファイルパス」を入力してENTERを押すだけ。
\set wg1 '\\w qbtmp \n \\g | find "" /v >> qbtmp & move qbtmp '

↓ 使用例。ファイルパスがそのままシェルに渡るので、適宜クォートが必要です(半角空白を含むとか、パス区切りがスラッシュの場合)。
\set wg1 '\\w qbtmp \n \\g | find "" /v >> qbtmp & move qbtmp '
select version() :wg1 "R:/test1.txt"
        1 file(s) moved.
select now() :wg1 "R:/test2.txt"
        1 file(s) moved.


定義した変数(ここでは:wg1)を打って実行される内容は、次のとおり。
  1. \w qbtmp  クエリ文字列を一時ファイルqbtmpに新規書き込み(qbtmpが既存なら上書き)。
  2. \g | find "" /v >> qbtmp  クエリを実行し、結果をqbtmpに追記。findを使うのはWindowsCMDシェル特有の事情(パイプで渡した文字列をそのままリダイレクトする普通の方法がない)。
  3. move qbtmpファイルパス  クエリとレスポンスが入ったqbtmpを、指定されたファイルに移す。

1.2.の間に改行(\n)を挟むことで、psqlのメタコマンドを連続実行してます。2.3.の間の & は、CMDシェルでのコマンドを連続させるため。3.moveコマンドが出すメッセージ、上の画像では「1 file(s) moved.」がそのままpsqlシェルに表示されます。


ファイル書き込みと同時に、画面表示もする(暫定版)

本当はクエリ結果だけ表示させたいけど、簡単な方法が見つかってません。とりあえず暫定的に、書き込んだファイルをそのまま表示するもの。↓ クエリがもう一度出るのが今いち…。
\set wg2 '\\w qbtmp \n \\g | find "" /v >> qbtmp & type qbtmp & move qbtmp '
select generate_series(1, 10) :wg2 "R:/test2.txt"
select generate_series(1, 10)
+-----------------+
| generate_series |
+-----------------+
|               1 |
|               2 |
|               3 |
|               4 |
|               5 |
|               6 |
|               7 |
|               8 |
|               9 |
|              10 |
+-----------------+
(10 行)

        1 file(s) moved.


追記書き込み・簡易版(一時ファイルを放置)

非追記を追記に変えるには、「move一時ファイル 最終ファイル」を「type一時ファイル>>最終ファイル」に変えれば済みます。ただし一時ファイルを最後に消そうとすると、最終ファイルの渡し方が面倒。とりあえず暫定版として一時ファイルを放置してよいなら ↓ こんな感じ。前項と同様に画面表示もします。
\set wg3 '\\w qbtmp \n \\g | find "" /v >> qbtmp & type qbtmp & type qbtmp >>'
select 1 :wg3 "R:/test3.txt"
select 1
+----------+
| ?column? |
+----------+
|        1 |
+----------+
(1 行)

select 2 :wg3 "R:/test3.txt"
select 2
+----------+
| ?column? |
+----------+
|        2 |
+----------+
(1 行)

select 3 :wg3 "R:/test3.txt"
select 3
+----------+
| ?column? |
+----------+
|        3 |
+----------+
(1 行)


↓ 放置した一時ファイルの後始末。psqlシェル上からできます。
\! dir qbtmp /b -- 一時ファイルの存在確認
\! del qbtmp    -- 消す


追記書き込み・改良版(出力ファイルを別途指定)

ここまではコマンド実行時に出力ファイルを指定してきましたが、追記の場合、1回だけ出力先を指定する方がいいかも。加えてクエリ結果だけを画面表示し、一時ファイルを片付ける改良版。↓
\set wg4 '\\g qbtmp \n \\w | find "" /v >> %o% & type qbtmp >> %o% & type qbtmp & del qbtmp'

\setenv o "R:/test4_1.txt"
select 1 :wg4
+----------+
| ?column? |
+----------+
|        1 |
+----------+
(1 行)

select 2 :wg4
+----------+
| ?column? |
+----------+
|        2 |
+----------+
(1 行)


変数wg4に入れたメタコマンドの中で、CMDシェルの環境変数%o%を出力先ファイルとして扱います。%o%の設定はpsqlのメタコマンドsetenvで好きな時に可能。出力先を変えながら複数のクエリ&レスポンスを記録できます。例えば ↓ こんな風に。
\setenv o "R:/test4_2.txt"
select 8 :wg4
+----------+
| ?column? |
+----------+
|        8 |
+----------+
(1 行)

select 9 :wg4
+----------+
| ?column? |
+----------+
|        9 |
+----------+
(1 行)


新規書き込み(既存ファイルの上書き)はできませんが、クエリ前に「\! delファイル名」を打って対象ファイルを消せば実質同じ。というわけで結局、このwg4(名前は何でもいいです)だけあれば足りそう。


昨日の色指定も追加(クエリ結果だけ別の色で表示、要ConEmu)

せっかくなので、昨日ConEmuを使ってできたクエリとレスポンス別々の色表示も足して ↓ 全部入り。これだけはConEmu必須で、コマンドプロンプトではエスケープシーケンスが変な形で入ると思います。
\set wg5 '\\g qbtmp \n \\w | find "" /v >> %o% & type qbtmp >> %o% & set /p x=\x1b[38;2;%color%m<nul& type qbtmp & del qbtmp'
\setenv o "R:/test5.txt"
\setenv color '255;0;0'
select random() :wg5
+-------------------+
|      random       |
+-------------------+
| 0.350998294074088 |
+-------------------+
(1 行)

\setenv color '0;0;255'
select now() :wg5
+-------------------------------+
|              now              |
+-------------------------------+
| 2016-02-06 22:50:28.122268+09 |
+-------------------------------+
(1 行)


(補足)ページャは入れてないので、長いレスポンスが一度に表示されます

今回wg2wg5という変数名で設定したコマンドは、クエリ結果の表示部分にページング(パイプでmore.comに渡す)を入れてません。そうすると後の処理が難しくなるため。長いレスポンスも一度にばばっと表示されますが、クエリと同時にファイル出力されてるので、そちらを見ればいいかと。そのうち改良策を考えます。