![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Команда DOS (<B>copy</B>, <B>del</B>, ...) без окна? [D5, Win95/98, WinXP]
Влад2 © (2002-12-10 16:28:00)Недавно я задавал подобный вопрос для распаковки архива. Мне хорошо помогли. Но для команд интерпретатора (через command.com) - copy, delи т.п. этот метод не работает.
Что нужно сделать, чтобы:
1. при выполнении ЭТИХ команд окно DOS не показывалось;
2. выполнение задачи не продолжалось, пока не выполнится команда DOS?
Вновь расчитываю на вашу помощь.
Спасибо.
Влад2 (2002-12-11 11:12:00) [1]Юрий Зотов:
>> А еще есть просто переменная Win32Platform
Да, действительно, это показалось мне простым и, главное, работает.
Большое спасибо всем откликнувшимся!
Вы мне очень помогли.
Может быть, эта ветка будет полезной и другим.
Юрий Зотов (2002-12-11 08:57:00) [2]> как узнать, какая операционка
А еще есть просто переменная Win32Platform. См. хелп и модуль SysUtils (там же - MajorVersion, MinorVersion).
Rouse_ (2002-12-11 01:51:00) [3]>как узнать, какая операционка
Есть очень хороший (полный) пример Игоря Шевченко в UBPFD
Есть очень хороший (полный) пример от Microsoft в MSDN
> в ответ на команду DOS del ... CreateProcess() ответит
> "не могу найти файл" (т.е. "исполняемый файл" del).
DOS = MAX, 8 символов+расширение = 12345678.123
Влад2:
По первому и второму вопросу есть полный ответ в FAQ
Желаю успехов
oomneeq (2002-12-11 01:34:00) [4]>как узнать, какая операционка (использовать cmd или command.com)?
сусчествует чуева чуча способов, но тебе это не надо :)
тебе ведь надо в конце концов знать что запускать.
(логичное предположение что
9х значит command.com а NT,2K,XP - значит cmd.exe в общем случае может оказаться неправдой)
Вот это поможет тебе правильно определить действующий командный процессор (кто б он ни был):
function GetEnvVar(variable: string) : string;
begin
SetLength(result,MAX_PATH+1);
SetLength(result,GetEnvironmentVariable(pchar(variable),pchar(result),MAX_PATH));
end;
...
WhatToRun:=GetEnvVar("COMSPEC");
...
CreateProcess(WhatToRun .....
а если вдруг интересна теория, читай про переменные окружения ОС
успехов
Влад2 (2002-12-10 21:16:00) [5]Большое спасибо всем!
Использую
CreateProcess(nil, "cmd /c del file.*",
nil, nil,
false,
CREATE_NO_WINDOW,
nil,
nil,
StartupInfo,
ProcessInfo)
И маленький вопросик: как узнать, какая операционка(использовать cmd или command.com)?
Smithson (2002-12-10 20:17:00) [6]правильно
Влад2 (2002-12-10 20:15:00) [7]oomneeq,
правильно ли я понимаю, что CreateProcess() будет выглядеть так:
CreateProcess("cmd", "/c del file.*",
nil, nil,
false,
CREATE_NO_WINDOW,
nil,
nil,
StartupInfo,
ProcessInfo)
?
Влад2 (2002-12-10 19:42:00) [8]Спасибо Smithson и Romkin!
Наверное, я переработал :) Про exit совсем забыл. Пользуюсь bat-файлом (он работает для всех команд, включая архивацию).
А про SHFileOperation почти не знал (т.е. основательно забыл)
oomneeq (2002-12-10 19:31:00) [9]>Влад2 (10.12.02 18:27)
>... в ответ на команду DOS del ... CreateProcess() ответит "не могу найти файл" (т.е. "исполняемый файл" del).
В том примере, что я давал, под XP надо в качестве исп. файла
указать
cmd.exe (или command.com для 9X)
a параметром-
/c del file.*
если неочевидно, почитай хелп по ключам коммандного процессора
удачи
Romkin (2002-12-10 18:43:00) [10]Выдрал из фака :-))
uses ShellAPI;
function DelFile( FileName : string ) : boolean;
var fos : TSHFileOpStruct;
begin
FillChar(fos, SizeOf(fos), 0);
with fos do begin
wFunc := FO_DELETE;
pFrom := PChar( FileName );
fFlags := FOF_NOCONFIRMATION or FOF_SILENT;
end;
Result := (0 = ShFileOperation(fos));
end;
Smithson (2002-12-10 18:41:00) [11]Ну Romkin прав.
А насчет WaitSingleObject, то в бат-файл можно поместить не только команду del, но и команду exit - он и закроется.
Romkin (2002-12-10 18:38:00) [12]SHFileOperation прекрасно это сделает, быстро, и без всяких окон (если не захочешь) :-))
Влад2 (2002-12-10 18:27:00) [13]Уважаемый Smithson,
если Вы имеете ввиду WaitSingleObject() после CreateProcess(), то в ответ на команду DOS del ... CreateProcess() ответит "не могу найти файл" (т.е. "исполняемый файл" del).
А если команду del поместить в файл.bat и запустить его с пом. CreateProcess(), то WaitSingleObject() будет висеть бесконечно долго.
Smithson (2002-12-10 18:18:00) [14]WaitSingleObject
Влад2 (2002-12-10 18:11:00) [15]Уважаемый Hooch:
>> зная HINSTANCE можно подождать окончания выполнения
А как?
Уважаемый Romkin,
конечно, можно использовать CopyFile, DeleteFile. Но если Вам надо, например, удалить файлов 100, то гораздо быстрее сделать это по маске командой DOS.
Спасибо за ответы.
Romkin (2002-12-10 16:54:00) [16]А что, CopyFile, DeleteFile не подходят?
Hooch (2002-12-10 16:53:00) [17]можно попробовать ShellExecute, если стартовать команду с флагом SW_HIDE, то окна не будет а зная HINSTANCE можно подождать окончания выполнения