stdoutとstderrの両方をBashのファイルにリダイレクトして追加するにはどうすればよいですか.   http://www.interwiz.koganei.tokyo.jp/software/PostgreSQL/windows.html 今回実行する処理は「echo %DIR%\%%i」=「echo <処理対象ディレクトリ><出力結果(1行)>」なため、 標準エラー出力を捨てるな. 標準エラーをBashスクリプトの変数に格納する方法 (10) たとえば、次のようなスクリプトがあるとします。 役に立たない.sh . 「2>&1」は簡単に説明すると、「2=標準エラー」の出力先を「1=標準出力」と一緒の場所にする設定です。 あるbatファイルから、powershellコマンドを使用して他バッチを呼び出す処理を作成しており、その他バッチの実行結果を標準出力(エラー出力もリダイレクト)させようと思って下記のように記述しました。 powershell.exe -Command Start-Process """ cd /d %~dp0 ェルスクリプトの N個目の引数が設定される変数 (位置パラメータと呼ばれる), **10番目の引数が設定される。**参照するには「, **プロンプトに使用される文字列が設定されている環境変数。**この変数の値を変更することで、プロンプトの表示形式を変更することができる。, **コマンドが複数行にわたった場合のプロンプトに使用される文字列が設定されている環境変数。**環境変数 PS1 と同様に値を変更することにより、プロンプトの表示形式を変更することができる。, **コマンドが格納されているディレクトリのパスが設定されている環境変数。**パスは「:」(コロン)区切りで複数設定可能。コマンド実行時には、この環境変数 PATH に設定されているディレクトリでコマンドの本体が自動的に検索される。つまり、環境変数 PATH に「/bin」を設定することにより、コマンドを「/bin/ls」のようにフルパスで指定しなくとも、「ls」のようにコマンド名のみ指定での実行が可能になる。, **タイムゾーンが設定されている環境変数。**特に変更するようなことは無いであろうが、古い UNIX 環境で昨日の日付を取得したい場合などに、一時的に変更する場合がある。, **デリミタ(区切り文字)として使用される値が設定されている環境変数。**IFS は “Internal Field Separator” の略。デフォルトではタブ、スペース、改行が設定されている。for 文の値リストの区切りや、read コマンドで読み込む値の区切りなどに使用される。, 型は存在しない (declare コマンドや typeset コマンドで似たようなことができるが推奨はしない), 変数名の大文字・小文字は区別される (, コマンドが正常に実行された場合は結果が変数に設定され (画面上にはなにも出力されない), エラーが発生した場合は画面上にエラーが出力される, 値の設定・・・変数 VAR に文字列 “aaa” が設定されるかされないか。, 返す値・・・変数 VAR を表にある形式で参照した時の値 (. 今回は次のフォルダを対象にテストしてみます。, 見ての通り、logと名の付くファイルは、名前にタイムスタンプが含んでいます。  もしエラーメッセージを保存する方法がありましたら、是非ご教授ください(.. よって次のように一部分だけを切り出すことで数値だけを抜け出せます。, 年月日は通常、「年/月/日」と表示されるため、置換によりスラッシュを削除しています。 @ECHO OFF 上記以外でもエラーメッセージを変数にとる方法はないですか。  にあるWindows版を使用しています。 ちなみに複数行コメントアウトは残念ながら分かりません。恐らくないと思います。, 現在の年月日は環境変数date、時分秒は環境変数timeにより取得できます。 コマンドを実行した時にエラーが発生した場合、標準出力ではなく標準エラー出力に対して出力が行われます。デフォルトでは標準出力と同じく標準エラー出力の出力先も画面に設定されていますが、リダイレクトを使って標準エラー出力の出力先をファイルへ変更することができます。 (SETによる一時的な変更のため、コマンドプロンプト終了時に消えますが), コメントアウトする場合、「rem コメント」と記述して下さい。 else処理が実施されていない場合、そもそものif文が間違っていることが分かるからです。, if文を使うことで次のように午前/午後で実行結果が異なるスクリプトを作成可能です。, ソート・絞り込みしたファイルに何かしらの処理をしたい場合はFOR文を使用します。 よって今回のスクリプト例は実質的に、logファイルの最新3件以外を表示するスクリプトです。 標準エラー出力のみを変数に設定する . リダイレクトの切り替えはWindowsでも可能です。 teeコマンドを使わずにUNIXで標準出力とエラー出力を、ファイルと標準出力の両方に出すには. しかし他のプログラムなら簡単なのにWindowsバッチでの書き方が分からない、ということが何度もあります。 今回はスペースを0に変換しています。, 環境変数date、timeは上記の通り/(スラッシュ)や:(コロン)で区切られています。 今回標準出力先は「sample.log」なため、エラー文も「sample.log」に出力されます。, Windows上で実行された処理の戻り値は環境変数ERRORLEVELにより取得可能です。 鍛錬 258Windows-バッチ,コマンドの実行結果を変数に格納(取得)するコマンドの実行結果を変数に格納(取得)する方法は、以下に示す通りです。for /F "usebackq delims=" %%a in (`コ またifの後にnotを付けることで、not条件にすることができます。, 注意点として、カッコの位置がずれると、高確率で上手く動きません。  psql -f sqllist.txt -o log.txt -h localhost [DB名] 標準エラー出力のみを変数に設定する . バッチファイルで各種設定を自動化したとき、ちゃんとエラーなく終わったかどうかを確認する方法として、ログファイルの作成方法をご紹介します。, 細かい内容は置いといてログ出力の方法コマンドだけ知りたい方は目次からまとめに飛んで下さい。, 今回は「実行しているバッチファイルのカレントフォルダ\log\PC名.log」となるように指定します。, なので上記ファイルを2回実行した場合、既に作成されているログの続きから出力されるので、ログファイルには「追記出力でログ出力します。」が2行記載された内容になります。, 上書き出力の方法でログを出力した場合、それ以前にあったログの内容は破棄されて現在の出力が上書きされます。, なので上記ファイルを2回実行した場合、既に作成されているログの内容は破棄されるので、ログファイルには「上書き出力でログ出力します。」が1行記載された内容になります。, 以前に実行したログに上書きする形でログを取得する場合は、この上書き出力を使用しますが、下記のように使ってしまうとログを残せなくなってしまうので注意して下さい。, この場合ログ出力を全て上書きで出力しているので、ログファイルの内容は「完了です。」の1行のみになります。, エラーメッセージはエラー出力に出力されるので、この方法だとエラーメッセージは出力されません。, こうするとエラー出力がファイルに出力されるので、ファイルの内容は「ファイルが見つかりません」となります。, しかし、これだと標準出力はファイルに出力されなくなってしまうので、どちらも出力するには「2>&1」を使います。, すでにバッチを実行済みでログがある場合、2回目を流すことなくエラーでバッチを止めたい場合はこの方法を使います。, このコマンドでログがる場合は「Exit」で処理から抜けるか、「goto」でエラー処理用のラベルに飛ぶことで中断させることができます。. 「%time: =0%」は前述した通り、スペースを0に置換することで1桁時の0埋めをします。   http://www.interwiz.koganei.tokyo.jp/software/PostgreSQL/windows.html それだけだとパットみ分かりにくいので、個人的には#とかを付けて「rem # コメント」と記述したりします。 結果をログファイルに吐き出したい場合、次のように不等号記号(>)でリダイレクトすることで可能です。 画面上に「プロセスはファイルにアクセスできません。別のプロセスが使用中です。」 戻り値が設定されていないコマンドを実行した場合、ERRORLEVELは更新されない。, ERRORLEVELに直接値を設定した場合、以降そのセッションにおいて戻り値の値はERRORLEVELへ代入されない。, 戻り値を取得したいコマンドの直後に、別の戻り値を取得するコマンドを実行すると当然ERRORLEVELは上書きされる。, you can read useful information later efficiently. これは文字列の置換を利用しており、「%環境変数:置換前=置換後%」という風に使います。 下記の場合、エラーメッセージである「ファイルが見つかりません」がコマンドプロンプト上に表示されています。, 今度はちゃんとエラーメッセージがログに出力されました。 If %ERRORLEVEL% gtr 0 ( タイムスタンプを分までにしたい場合は、「%TS_TIME:~,-5%」とすれば可能です。, コマンドの結果はそのままでは標準出力され、コマンドプロンプト上に表示されます。  という環境で使用しています。  WindowsXP + Cygwin + PostgreSQL 「/b」オプションがないと、コマンドプロンプト上でスクリプト実行した場合、コマンドプロンプトが閉じてしまいます。, if文は他の言語と似たように次のように使うことが可能です。 これに付いているオプションは次の通りです。, よって「dir C:\sample_log*.log /b /a-d /o-n」により、次の通り拡張子がlogであるファイルのみが表示されます。 そのため整形しないとファイル名のタイムスタンプなどには使いにくいです。 test1.bat What is going on with this article? コマンドの標準エラー出力を変数に代入 ; ハック; 2016.07.13; 9,672; bash; コマンドの標準エラー出力を変数に代入. (psql -h localhost [DB名] < sqllist.txt) 2>&1) > log.txt 具体的には次のような記述です。, バッチファイルはミスがあっても気付きにくいため、if文を記述する際は、初めのうちはelse処理も記述することを推奨します。 コマンドの標準エラー出力を変数に代入 ; ハック; 2016.07.13; 9,672; bash; コマンドの標準エラー出力を変数に代入.  psqlは 後ろ3文字を削除しているためマイクロ秒を消しています。 :eof よろしくお願いします。, 世の中の成功している男性には様々な共通点がありますが、実はそんな夫を影で支える妻にも共通点があります。今回は、内助の功で夫を輝かせたいと願う3人の女性たちが集まり、その具体策についての座談会を開催しました。.  という環境で使用しています。  WindowsXP + Cygwin + PostgreSQL  にあるWindows版を使用しています。 「%date:/=%」のように置換対象を/にし、置換後の値を空白にすることで削除可能です。, 時分秒は通常、「時:分:秒.マイクロ秒」と表示されます。 このようにFOR文を使うことで柔軟なバッチを作成することが可能です。, PostgreSQL大好き人間です。 AdminWeb ©2006-2020 Buzzword Inc.. All Rights Reserved. もう1つは個人的な意見ですが、cronで動かすようなバッチとかは、 標準出力には出すような内容は、ログファイルに出すようにしておくのが良いかと思ってます。 2. 様々な絞り込みの処理が可能です。 なのでこれで標準出力とエラー出力の両方をファイルへ出力できます。 ログが存在する場合にエラーにする方法 すでにバッチを実行済みでログがある場合、2回目を流すことなくエラーでバッチを止めたい場合はこの方法を使います。 こんにちは、honiyonです。