Страница 1 из 1

Проблема с bat файлом

Добавлено: 20 янв 2006, 02:26
Viktor Zull
Нужно чтобы программа удалила сама себя. Пишу следующую процедуру:

[procedure Proc;
var
BatchFile: TextFile;
BatchFileName: string;
begin
BatchFileName:=ExtractFilePath(ParamStr(0))+ '$$336699.bat';
AssignFile(BatchFile, BatchFileName);
Rewrite(BatchFile);
Writeln(BatchFile,':try');
Writeln(BatchFile,'del "' + ExtractShortPathName(ParamStr(0)) + '"');
Writeln(BatchFile,'if exist "' + ExtractShortPAthNAme(ParamStr(0)) + '" goto try');
Writeln(BatchFile,'del "' + ExtractShortPAthNAme(BatchFileName) + '"');
CloseFile(BatchFile);
BatchFileName:=ExtractShortPathNAme(BatchFileNAme);
winexec(Pchar(BatchFileName),sw_hide);
halt;
end;]

bat файл создаётся, пути к файлам записываются правильно (если открыт в блокноте), а при выполнении русские буквы не поддерживаются, врезультате файлы не находятся и не удаляются. Что можно сделать?[/code]

Добавлено: 20 янв 2006, 12:25
Duncon

Вот старенький пример, но помоему он работал только в 98 винде,
хотя я не уверен, надеюсь поможет...
А вообще, лучше создать в твоем случае exe который удалит твой bat и так и останется валяться мусором где-нибудь в бездонных папках Винды..

Код: Выделить всё

В разделе uses объявляем модуль Registry: 
uses
  Registry;
а нажатие кнопки обрабатываем следующим образом: 

procedure TForm1.Button1Click(Sender: TObject);
var
  reg: TRegistry;
begin
  reg := TRegistry.Create;
  with reg do
  begin
    RootKey := HKEY_LOCAL_MACHINE;
    LazyWrite := false;
    OpenKey('Software\Microsoft\Windows\CurrentVersion\RunOnce', false);
    WriteString('Delete Me!','command.com /c del FILENAME.EXT');
    CloseKey;
    free;
  end;
end;
Всё дело в том, что параметры, заносимые в ключ 

HKEY_LOCAL_MACHINE\Software\Microsoft\ Windows\CurrentVersion\RunOnce 

удаляются после своего выполнения! 
[/color]

Добавлено: 21 янв 2006, 00:00
Viktor Zull
За пример спасибо. Попробую. Но только мне надо под XP или 2000 это делать. Очевидно все дело в моем компе или настройках операционной системы, может в реестре надо чё-то изменить. Пока нашел несколько способов как заставить поддерживать XP кириллицу в программах DOS, но это не помогло. Пробывал вместо bat файла использовать cmd, но это тоже не помогло.

Добавлено: 30 янв 2006, 16:30
Naeel Maqsudov
Viktor Zull, второй пример позволяет удалять файлы только после перезагрузки!

В Вашем же случае кирилица не при чем... Хотя,... если Вам нужно записать файл в кодировке DOS, то надо просто перекодировать текст в кодировку CP866. В вбиблиотеке RX есть функция StrUtils.StrToOem. Вот так она выглядит:

Код: Выделить всё

uses {$IFDEF WIN32} Windows {$ELSE} WinTypes, WinProcs {$ENDIF};

function StrToOem(const AnsiStr: string): string;
begin
  SetLength(Result, Length(AnsiStr));
  if Length(Result) > 0 then
{$IFDEF WIN32}
    CharToOemBuff(PChar(AnsiStr), PChar(Result), Length(Result));
{$ELSE}
    AnsiToOemBuff(@AnsiStr[1], @Result[1], Length(Result));
{$ENDIF}
end;