unit BatFileUnit; interface uses Windows, SysUtils, AnsiStringFileUnit, CreateProcessUnit, ExePathUnit, StringUnitLight, uses_end; function CommandExecResult(Command: String): String; procedure CommandExec(Command: String; Modal: Boolean = True); overload; procedure RebootApp(MilliSec: Cardinal); procedure DeleteSelfAppExe; implementation {------------------------------- // ファイルかフォルダの存在を確認します 備考: 履歴: 2004/11/06 //------------------------------} function FileFolderExists(FileFolderName: String): Boolean; begin if FileExists(FileFolderName) then begin Result := True; Exit; end else if DirectoryExists(FileFolderName) then begin Result := True; Exit; end else begin Result := False; end; end; //------------------------------ //------------------------------- //1行のコマンドを実行して出力結果を返す関数 function CommandExecResult(Command: String): String; var CommandBatFilePath, DumpFilePath: String; CommandBatText: String; begin // CommandBatFilePath := ExtractFilePath(ParamStr(0)) + // 'TmpCommand.bat'; // DumpFilePath := ExtractFilePath(ParamStr(0)) + // 'DumpResult.tmp'; CommandBatFilePath := IncludeLastStr(GetCurrentDir, PathDelim) + 'CommandExecResult.bat'; DumpFilePath := IncludeLastStr(GetCurrentDir, PathDelim) + 'DumpResult.tmp'; CommandBatText := Command + ' > ' + IncludeBothEndsStr(DumpFilePath, '"') + sLineBreak; // Windows.MessageBox(0, PChar(CommandBatFilePath+#13#10+CommandBatText), '', IDOK); SaveStringToFile(CommandBatFilePath, CommandBatText); EasyCreateProcessCmd(CommandBatFilePath, True, False); Result := LoadStringFromFile(DumpFilePath); DeleteFile(CommandBatFilePath); DeleteFile(DumpFilePath); end; //------------------------------- //結果は返さずにバッチファイルでコマンド実行する関数 procedure CommandExec(Command: String; Modal: Boolean = True); var CommandBatFilePath: String; CommandBatText: String; begin CommandBatFilePath := IncludeLastStr(GetCurrentDir, PathDelim) + 'CommandExec.bat'; CommandBatText := Command + sLineBreak + '@DEL %0'; SaveStringToFile(CommandBatFilePath, CommandBatText); EasyCreateProcessCmd(CommandBatFilePath, Modal, False); // DeleteFile(CommandBatFilePath); end; //procedure CommandExec(Command: String; Modal: Boolean = True; // SleepMilliSec: Cardinal= 0); //var // CommandBatFilePath: String; // CommandBatText: String; // SleepScriptFilePath: String; // SleepScriptText: String; //begin // SleepScriptFilePath := // IncludeLastStr(GetCurrentDir, PathDelim) + 'Sleep.vbs'; // SleepScriptText := // 'Option Explicit' + sLineBreak + // 'WScript.sleep('+IntToStr(SleepMilliSec)+')' + sLineBreak; // SaveStringToFile(SleepScriptFilePath, SleepScriptText); // // CommandBatFilePath := // IncludeLastStr(GetCurrentDir, PathDelim) + 'CommandExec.bat'; // CommandBatText := // '@ECHO OFF'+ sLineBreak + // 'Sleep.vbs'+ sLineBreak + // Command + sLineBreak + // // 'DEL ' + SleepScriptFilePath + sLineBreak + // 'DEL %0' ; // SaveStringToFile(CommandBatFilePath, CommandBatText); // EasyCreateProcessCmd(CommandBatFilePath, Modal, False); // //// DeleteFile(CommandBatFilePath); //end; (*------------------------------- //自分自身を削除するコード 機能: 処理: 1.ExeFileとBatファイル自身を削除する Batファイルを作ります 2.Batファイルを保存します 3.BatファイルをSW_HIDEで起動します 4.アプリケーションを終了する 使い方: この関数を実行した後に自分自身を終了するコードを書いてください DeleteSelfAppExe(5000); Application.MainForm.Close; 備考: 作成するBatファイルは以下のようなものです。 :TOP @DEL "project1.exe" IF EXIST "project1.exe" GOTO TOP @DEL %0 exeが存在している間はそのexeを消そうとし続けます。 @DEL %0で自分自身(ここではproject1.bat)も消し去る仕掛けです。 履歴: 2000/11/10 2005/03/14 スペース含むフォルダでも動作するようにパスを引用符で囲んだ %0でbatファイルを指定した -------------------------------*) procedure DeleteSelfAppExe; var DeleteBatFileName: String; DeleteBatFileText: String; begin DeleteBatFileName := AppFolderPath+PathDelim+'DeleteSelf.bat'; DeleteBatFileText := '@ECHO OFF'+ sLineBreak + ':TOP' + sLineBreak + 'DEL "'+ParamStr(0)+'"' + sLineBreak + 'IF EXIST "'+ParamStr(0)+'" GOTO TOP' + sLineBreak+ 'DEL %0' + sLineBreak; SaveStringToFile(DeleteBatFileName, DeleteBatFileText); // WinExec(PChar(DeleteBatFileName), SW_HIDE); EasyCreateProcessCmd(DeleteBatFileName, False, False); end; {------------------------------- // 再起動するコード 処理: 1.Sleep.vbsを作成する。 2.Reboot.batを作成する 3.Reboot.batをSW_HIDEで起動する Reboot.batはSleep.vbsを起動して 元のExeを起動して、Sleep.vbsとReboot.batを削除 使い方: この関数を実行した後に自分自身を終了するコードを書いてください RebootApp(5000); Application.MainForm.Close; 備考: uses StringUnitHeavyが必要、SaveStringToFile uses Windowsが必要、WinExec 履歴: 2003/12/22 2007/07/12 Sleep.exeからSleep.vbsを使用するように変更した 参考: 1.2 指定秒数だけ処理を待機する - VBScript & JScript(JavaScript) Tips for WSH http://www.happy2-island.com/vbs/cafe02/capter00102.shtml //------------------------------} procedure RebootApp(MilliSec: Cardinal); var RebootBatFileName: String; RebootBatFileText: String; SleepScriptFileName: String; SleepScriptFileText: String; begin SleepScriptFileName := AppFolderPath+PathDelim+'Sleep.vbs'; SleepScriptFileText := 'Option Explicit' + sLineBreak + 'WScript.sleep('+IntToStr(MilliSec)+')' + sLineBreak; SaveStringToFile(SleepScriptFileName, SleepScriptFileText); RebootBatFileName := AppFolderPath+PathDelim+'Reboot.bat'; RebootBatFileText := '@ECHO OFF'+ sLineBreak + 'Sleep.vbs'+ sLineBreak + 'START ' + ParamStr(0) + sLineBreak + 'DEL ' + SleepScriptFileName + sLineBreak + 'DEL ' + RebootBatFileName + sLineBreak; SaveStringToFile(RebootBatFileName, RebootBatFileText); // WinExec(PChar(RebootBatFileName), SW_HIDE); EasyCreateProcessCmd(RebootBatFileName, False, False); end; //------------------------------ end.