Исполнение команд DOS из под приложения (графического)
Модератор: Модераторы
- GN
- новенький
- Сообщения: 67
- Зарегистрирован: 29.07.2007 07:35:56
- Откуда: Казахстан
- Контактная информация:
Исполнение команд DOS из под приложения (графического)
Возможно ли исполнять досовские команды (например, dir, cd и т.п.) из обычного графического приложения (под окнами)?
Например, имеется компонент TEdit, в него вводят команды, и по горячей клавише или с помощью кнопки эта команда выполняется.
Или пусть даже будет задействовано cmd.exe только чтобы оно было свёрнутым.
Например, имеется компонент TEdit, в него вводят команды, и по горячей клавише или с помощью кнопки эта команда выполняется.
Или пусть даже будет задействовано cmd.exe только чтобы оно было свёрнутым.
-
SAK
- постоялец
- Сообщения: 158
- Зарегистрирован: 17.02.2006 23:45:14
- Откуда: Тим
- Контактная информация:
А зачем выполнять dir свёрнутым? Надо бы определиться в цели, зачем это надо, а потом уже выбирать путь решения. Если надо сменить каталог, то это можно сделать и не запуская внешнего приложения, и список файлов получается также. А если надо выполнять команды вводимые с клавиатуры, то лучше взять системную переменную COMSPEC, там прописан текущий командный процессор (cmd.exe или command.com) и запускать данную программу с параметром '/C '+<команда>.
Всё сказанное относится к работе под Windows или DOS.
Всё сказанное относится к работе под Windows или DOS.
-
SAK
- постоялец
- Сообщения: 158
- Зарегистрирован: 17.02.2006 23:45:14
- Откуда: Тим
- Контактная информация:
Самый простой пример:
Можно использовать GetEnvironmentVariable (в модуле windows) и TProcess вместо GetEnv и Exec.
Код: Выделить всё
program Project1;
uses DOS;
var
command: string;
begin
command:='dir';
Exec(GetEnv('COMSPEC'), '/C '+command);
Readln;
end. Можно использовать GetEnvironmentVariable (в модуле windows) и TProcess вместо GetEnv и Exec.
- GN
- новенький
- Сообщения: 67
- Зарегистрирован: 29.07.2007 07:35:56
- Откуда: Казахстан
- Контактная информация:
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
command: string;
begin
command := 'systeminfo';
Exec(GetEnv('COMSPEC'), command);
Readln;
end; При нажатии кнопки, cmd.exe открывается, но не выполняется команда, а в приложении выскакивает ошибка "File not open"
- GN
- новенький
- Сообщения: 67
- Зарегистрирован: 29.07.2007 07:35:56
- Откуда: Казахстан
- Контактная информация:
Во, а если так:
То команда выполняется, и окно (досовское) сразу закрывается, и потом опять выходит ошибка "File not open"
-=-=-=
Если "Readln;" убрать, то ошибка исчезнет, но досовск. окно по прежнему закрывается
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
command: string;
begin
command := 'systeminfo';
Exec(GetEnv('COMSPEC'), '/C ' + command);
Readln;
end; -=-=-=
Если "Readln;" убрать, то ошибка исчезнет, но досовск. окно по прежнему закрывается
GN писал(а):Если "Readln;" убрать, то ошибка исчезнет, но досовск. окно по прежнему закрывается
Код: Выделить всё
Exec(GetEnv('COMSPEC'), '/K ' + command);-
SAK
- постоялец
- Сообщения: 158
- Зарегистрирован: 17.02.2006 23:45:14
- Откуда: Тим
- Контактная информация:
Правильно. /C - выполнить команду и выйти из командного процессора, /K - тоже самое, только не выходит из командного процессора, для выхода надо Exit набирать. У меня приведён пример консольного приложения, поэтому "File not open" не выскакивает на Readln, которая поставлена для ожидания нажатия Enter до закрытия окна. Для графического приложения надо искать другие способы оставить окно видимым.
Последний раз редактировалось SAK 21.09.2007 22:54:50, всего редактировалось 1 раз.
Вчера наткнулся на прикол обработки переменных DOS через getenv('temp') под Windows. На выходе получил "/cygdrive/c/Temp" 
PapaNT
А у меня полный порядок - выдало "C:\Temp", как и положено...
А у меня полный порядок - выдало "C:\Temp", как и положено...
странно. Я пробовал через модуль DOS GetEnv и через sysutils.GetEnivormentVariable...Vadim писал(а):PapaNT
А у меня полный порядок - выдало "C:\Temp", как и положено...
Добавлено спустя 14 минут 38 секунд:
Re: Исполнение команд DOS из под приложения (графического)
File Edit Search Run Compile Debug Tools Opti
╔═[■]═════════════════════ D:\FPC\2.2.4\pas\tets.pas
║Program Env;
║
║Uses DOS,sysutils;
║Var
║ s : string;
║Begin
║ Writeln;
║ s := sysutils.GetEnvironmentVariable('Temp');
║ Writeln(s);
║ s := dos.getenv('Temp');
║ Writeln(s)
║End.
╚══════ 12:1 ═◄■▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
┌────────────────────────────────── Watches ─────────
│ s = '/cygdrive/c/TEMP'
Оказалось, виноват пошаговый отладчик. Когда запускал по Ctrl + F9, то все прокатывло нормально, а при пошаговой отладке вылезала эта бага...
мне кажется что можно использовать аналог старой C-ишной комманды -system
Код: Выделить всё
var s: string;
...
для DOS
s:='r.bat < y.txt ';
//или для линукса
s:='chmode a+rw '+filename ;
{$IFNDEF FPC}
Libc.system(pchar(s));
{$ELSE}
fpSystem(s);
{$ENDIF}
