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