Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Команда 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 можно подождать окончания выполнения


Наверх

Титульная страница Поиск, карта сайта Написать письмо