Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2005年02月15日] [更新 2015年08月14日] Delphi サンプルプログラム集
530_バッチファイルを ShellExecute 関数で実行
動作確認等 Windows 7 U64(SP1) + Delphi XE(UP1) Pro
530_ConsoleBat1.zip [1,074 KB] 2015年08月14日版 (EXE 同梱)







バッチファイルを ShellExecute 関数で実行


拡張子が .BAT のファイルを,ShellExecute 関数を使用して実行するサンプルです.
ShellExecute 関数の他のサンプルと違うのは,実行ファイルがバッチファイルであることです.

本ページのサンプルは,コマンドプロセッサ (コマンドプロンプトを起動するプログラム) を非表示で起動して,バッチファイルに書かれたコマンドを実行します.



[備考]
コマンドプロンプトに関しては以下の記事も参考にしてください.




01_実行時にバッチファイルを作成して ShellExecute 関数で実行


本サンプルでは,バッチファイルを実行時に作成します.バッチファイルに書かれたコマンドの実行が終了したら,そのバッチファイル自身を自動的に削除します.



図1
実行時画面
  • ボタンをクリック
  • 終了するとダイアログが表示される
  • コマンドプロンプトは非表示
図2
出力ファアイル
  • フォルダ内に TestDir.txt ができる
図3
TestDir.txt の例

リスト1
ShellExecute 関数を使用したバッチファイルの実行
バッチファイルをコード内で作成して,実行後,そのバッチファイルを削除
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;
var
  Form1: TForm1;

implementation

uses
  ShellAPI;

{$R *.DFM}

//=============================================================================
//  ShellExecuteを使用したバッチファイルの実行例
//  指定のディレクトリリストをこのフォルダにTestDir.txtで保存
//
//  LBatFullPath  バッチファイルの保存先
//  LOutFullPath  出力先のファイルの保存先
//  終了後にDEL   作成したバッチファイル自身を%0で削除する
//
//  ShellExecuteの使用にはusesにShellAPIが必要
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  LBatFullPath : String;
  LOutFullPath : String;
  LStringList  : TStringList;
begin
  LBatFullPath := ExtractFilePath(Application.ExeName) + 'Testbat.BAT';
  LOutFullPath := ExtractFilePath(Application.ExeName) + 'TestDir.TXT';

  //DeleteFile関数の引数のファイル名はダブルクォーテーションがあると削除されない
  DeleteFile(LOutFullPath);
  //パスに空白文字がある場合は,ダブルクォーテーションで囲む
  LOutFullPath := AnsiQuotedStr(LOutFullPath, '"');

  //バッチファイルを作成してこのEXEがあるフォルダに保存
  LStringList := TStringList.Create;
  try
    LStringList.Add('CD D:\');
    LStringList.Add('DIR >' + LOutFullPath);
    LStringList.Add('DEL %0');
    LStringList.Add('EXIT');
    LStringList.SaveToFile(LBatFullPath);
  finally
    FreeAndNil(LStringList);
  end;

  ShellExecute(Handle, 'open', PChar(LBatFullPath), nil, nil, SW_HIDE);
  Application.MessageBox('終了しました', 'バッチ処理', MB_OK);
end;

end.




02_ディスク上のバッチファイルを ShellExecute 関数で実行


パッチファイルが既に作成済みであれば,以下のように単に ShellExecute 関数で,そのパッチファイルを実行するだけです.

このコードは,パッチファイルを起動しているだけです.これは,パッチファイルをダブルクリックで起動するのと同じです.
バッチファイルを Delphi のコードから実行する場合,前項のサンプルのように,実行時にパッチファイルのコードを作成すれば,いろいろな処理も追加でき,柔軟性があります.


リスト2
作成済みのバッチファイルの実行
//=============================================================================
//  ShellExecuteを使用したバッチファイルの実行例
//  ディスク上のバッチファイルを実行
//
//  ShellExecuteの使用にはusesにShellAPIが必要
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  LBatFullPath : String;
begin
  LBatFullPath := ExtractFilePath(Application.ExeName) + 'Testbat.BAT';

  ShellExecute(Handle, 'open', PChar(LBatFullPath), nil, nil, SW_HIDE);
  Application.MessageBox('終了しました', 'バッチ処理', MB_OK);
end;


すぐテストできるように,以下のパッチファイルをサンプルプログラムに添付しています.


SET CURRDIR=%CD%
CD /D D:\
DIR > "%CURRDIR%\TestDir.TXT"
EXIT




03_カレントディレクトリとバッチファイルがあるディレクトリ


パッチファイルを実行する際,バッチファイルが置いてあるディレクトリ,あるいはカレントディレクトリのパス名が必要なことがあります.
実行時にバッチファイルを作成するのであれば,Delphi のコードで取得することができますが,バッチファイルを用意する場合はそうはいきません.バッチファイルの中で,それらのディレクトリを取得するには,%~dp0,%cd% が利用できます.以下はその例です.


@echo off
rem ------------------------------------------
rem このバッチファイルがあるディレクトリの取得
rem ------------------------------------------
set thisdir=%~dp0
echo.
echo 実行したバッチファイルがあるディレクトリ
echo %thisdir%
dir c:\ > "%thisdir%TestDir.txt"
echo.>> "%thisdir%TestDir.txt"
echo.>> "%thisdir%TestDir.txt"
rem
rem ------------------------------------------
rem カレントディレクトリの取得
rem ------------------------------------------
SET currdir=%cd%
echo.
echo 現在のディレクトリ
echo %currdir%
dir >> "%currdir%\TestDir.txt"
echo.
pause
exit


ディレクトリ D:\000\300 からコマンドプロンプトを起動します.あるいはコマンドプロンプトを起動して,カレントディレクトリを D:\000\300 に移動します.
そして,D:\100\500 内にある上のバッチファイルを実行した結果が下図です.

最初の dir コマンドの結果は,バッチファイルが置いてある D:\000\500 に保存されます.2 番目の dir コマンドの結果は,カレントディレクトリである D:\000\300 内に保存されます.



図4
実行結果