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
実行結果