一行追加で、ダブルクリック実行時にリダイレクト処理させる

  • 2
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

リダイレクト処理復習

まずは標準出力への出力を、画面ではなくファイルへ変更するリダイレクトについてです。

  • 標準出力だけ
    batファイルorコマンド > ファイル名

  • 標準出力だけ(追記)
    batファイルorコマンド >> ファイル名

  • 標準エラー出力だけ
    batファイルorコマンド 2 > ファイル名

  • 標準出力と標準エラー出力を別々に
    batファイルorコマンド > ファイル名 2 > エラーファイル名

  • 標準出力と標準エラー出力を一緒に
    batファイルorコマンド > ファイル名 2>&1

ただ、この場合はコマンドラインで実行時にリダイレクト指定する必要があるので、batをダブルクリック実行したときは利用できません。

ダブルクリック実行時にリダイレクト処理させたい!

(`・ω・)<たい!

先頭に一行追加します

実行スクリプト:sample.bat
出力ファイル:test.log

hoge.bat
@echo off & if not "%HOGE%"=="hoge" ( set HOGE=hoge&call "%~dp0sample.bat" > test.log&exit)&@echo on

これで、ダブルクリック実行時でもファイル出力ができます。

eof使う場合(2行になっちゃいますが…)

hoge.bat
@echo off & if not "%HOGE%"=="hoge" ( set HOGE=hoge&call "%~dp0sample.bat" > test.log&goto eof)&@echo on

-----処理------

:eof

展開してみる

sample.bat
@echo off
 if not "%HOGE%"=="hoge" ( 
   set HOGE=hoge
   call "%~dp0sample.bat" > test.log
   exit 
 )
@echo on

初回(環境変数HOGEに値が入っていない)は環境変数に値を設定して、自分自身を呼び出します。この時にリダイレクト指定を行っています。
呼び出したあとはif文に入らないので、その後の処理が行われます。

ポイント

"%HOGE%"=="hoge"

起動したコマンドの環境変数は起動されたコマンドの環境変数に引き継がれることを利用しています。
また、コマンドプロンプトから新たに登録した環境変数は終了後破棄されるので同環境で何度も実施が可能です。

%~dp0

実行されているファイルが置かれているカレントディレクトリを表すお決まりの書き方です。

記号 意味
%0 実行されているファイルのパス
~ "を削除する
d ドライブ文字だけに展開する
p ファイル名を除くパスの部分に展開する

それぞれで実行すると、以下の通りになります。(ex デスクトップで実行)

確認用.bat
@echo off
echo %0
echo %~0
echo %~d0
echo %~p0
echo %~dp0
出力結果
"C:\Users\username\Desktop\確認用.bat"
C:\Users\username\Desktop\確認用.bat
C:
\Users\username\Desktop\
C:\Users\username\Desktop\

「%~dp0」は「\」で終了しているので、「%~dp0sample.bat」と語尾にファイル名を付けて使用しますが、call実行時に空白を含むパスだとエラーになるため「"%~dp0sample.bat"」としています。

参考

勉強になりましたm(_ _)m!

環境変数(他、%~dp0 等)
batファイルで、そのファイル自身のパスを取得する
Windows、バッチファイル(.bat)を最小化した状態で起動する