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
出力ファアイル
|
|
図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 のコードから実行する場合,前項のサンプルのように,実行時にパッチファイルのコードを作成すれば,いろいろな処理も追加でき,柔軟性があります. |
//=============================================================================
// 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
実行結果 |
|