Почему мое приложение зависает при запуске из планировщика Windows?

У меня есть простое приложение:

uses
  SysUtils;

{$R *.res}

procedure Log(text: string);
var
  myFile: textfile;
begin
  AssignFile(myFile, 'my.log');
  if not(FileExists('my.log')) then
    Rewrite(myFile)
  else
    Append(myFile);
  Writeln(myFile, text);
  CloseFile(myFile);
end;

begin
    Log(TimeToStr(Now)+' Passed!');
end.

Когда я пытаюсь запустить это приложение через планировщик заданий Windows, у меня возникает проблема. Запланированная задача имеет статус «выполняется», но ничего не происходит.


person k.e.d.r.    schedule 10.03.2013    source источник
comment
Вы действительно должны использовать полный путь. Теперь вы понятия не имеете, в какой папке создается файл.   -  person Andreas Rejbrand    schedule 10.03.2013
comment
Возможно, у вас есть исключение ввода-вывода, и ваша программа не завершается.   -  person kobik    schedule 10.03.2013
comment
Какой пользователь запускает приложение. Вероятно, он работает в сеансе 0. Вам нужно будет указать свои учетные данные для задачи, чтобы увидеть ее на своем рабочем столе.   -  person David Heffernan    schedule 10.03.2013
comment
Я предполагаю, что в доступе отказано, поскольку, где бы ни находилось приложение, которое вызывает это, оно будет находиться в системном местоположении. Вы искали на системном диске файл my.log?   -  person Jerry Dodge    schedule 10.03.2013
comment
Добавьте «flush (myfile)» перед «closefile»   -  person No'am Newman    schedule 11.03.2013
comment
@ Джерри Додж Да, есть. Насколько я понимаю, проблема не в том, что я не могу найти лог-файл, а в том, что приложение не закрывается.   -  person k.e.d.r.    schedule 11.03.2013
comment
@Andreas Rejbrand Спасибо, Андреас. С полным путем все работает правильно.   -  person k.e.d.r.    schedule 11.03.2013


Ответы (1)


Вам нужно указать полный путь, где сохранить файл. Когда планировщик задач Windows запускает ваше приложение, рабочий каталог вашего приложения будет находиться там, где находится приложение планировщика задач. В свою очередь, Windows не позволяет вашему приложению сохранять файл в этом месте. Следовательно, вы должны указать ему, где именно сохранить файл.

procedure Log(text: string);
var
  myFile: textfile;
  Filename: String;
begin
  Filename:= IncludeTrailingBackslash(ExtractFilePath(ParamStr(0)))+'my.log';
  AssignFile(myFile, Filename);
  if not(FileExists(Filename)) then
    Rewrite(myFile)
  else
    Append(myFile);
  Writeln(myFile, text);
  CloseFile(myFile);
end;

Я предполагаю, что Windows отказывает в доступе из-за вашего заголовка «зависание». Тем не менее, даже если проблема не в отказе в доступе, вы все равно не знаете, где находится это место.

person Jerry Dodge    schedule 11.03.2013
comment
Джерри, Напоминание: запись в папку, где хранится exe, опасна, поскольку она может быть запрещена в зависимости от уровня безопасности и версии Windows. Не было бы безопаснее хранить в папке с меньшими ограничениями — например, в AppData или Documents? - person RobertFrank; 11.03.2013
comment
@Robert Да, это то, что я пытаюсь донести, но не мне решать, где сохранить файл, я ответил на это, чтобы соответствовать конкретным потребностям OP, соответствуя их исходному коду, который предполагает, что они хотят, чтобы он был сохранен там. - person Jerry Dodge; 11.03.2013