Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.10.2018, 15:15   #1
TEKTON
Пользователь
 
Регистрация: 19.01.2011
Сообщений: 10
По умолчанию Команды Cmd в консоли Delphi

Приветствую.
Насчёт запуска какого нить файла понятно:
ShellExecute или WinExec

А как выполнять другие команды cmd с параметрами?
Например:
Код:
del /S/F/Q %USERPROFILE%\AppData\Local\Temp\*.*
Или
copy /y file1.txt file2.txt
или
MKDIR  Newfolder
или
XCOPY /E/G/H/Y 'D:\myfiles\*.*' 'j:\backup\myfiles\*.*'
или
ATTRIB -R-A-S-H C:\folder /D
Ну и т.д.
Если можно конкретные примеры.
Спасибо.
TEKTON вне форума Ответить с цитированием
Старый 22.10.2018, 15:18   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

https://stackoverflow.com/questions/...gram-in-delphi

если команда командного интерпретатора (см. CMD /?) тогда нужно указывать cmd.exe
Код:
var sparam : string;
begin
  sparam := '/K ping 127.0.0.1';
  ShellExecute(Handle, nil, 'cmd.exe', PChar(sparam), nil, SW_SHOW);
а если это отдельный exe-шник (см. attrib.exe)
тогда можно так:
Код:
sparam := '-R-A-S-H C:\folder /D';
  ShellExecute(Handle, nil, 'attrib', PChar(sparam), nil, SW_SHOW);

Последний раз редактировалось Serge_Bliznykov; 22.10.2018 в 15:28.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.10.2018, 16:34   #3
TEKTON
Пользователь
 
Регистрация: 19.01.2011
Сообщений: 10
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
var sparam : string;
begin
sparam := '/K ping 127.0.0.1';
ShellExecute(Handle, nil, 'cmd.exe', PChar(sparam), nil, SW_SHOW);
Тут всё ясно.
А вот куда прописываются именно комманды
copy,
del,
XCOPY ?
Если по шаблону делать, то так получается?
Код:
sparam := 'del /S/F/Q %USERPROFILE%\AppData\Local\Temp\*.*';
  ShellExecute(Handle, nil, 'cmd.exe', PChar(sparam), nil, SW_SHOW);
Или как ?

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
...
а если это отдельный exe-шник (см. attrib.exe)
тогда можно так:
Код:
sparam := '-R-A-S-H C:\folder /D';
  ShellExecute(Handle, nil, 'attrib', PChar(sparam), nil, SW_SHOW);
Тут немного не понял.
Код:
ATTRIB -R-A-S-H C:\folder /D
Это ж тоже комманда через cmd.exe выполняется.
TEKTON вне форума Ответить с цитированием
Старый 22.10.2018, 16:45   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от TEKTON Посмотреть сообщение
Если по шаблону делать, то так получается?
Код:
sparam := 'del /S/F/Q %USERPROFILE%\AppData\Local\Temp\*.*';
  ShellExecute(Handle, nil, 'cmd.exe', PChar(sparam), nil, SW_SHOW);
да, вроде бы так.
А что - не работает? Или папку temp не чистит?

NB. получить список файлов и удалять файлы можно нативными командами Delphi


Цитата:
Сообщение от TEKTON Посмотреть сообщение
Тут немного не понял.
Код:
ATTRIB -R-A-S-H C:\folder /D
Это ж тоже комманда через cmd.exe выполняется.
Так то оно так, но не совсем.
Дело в том, есть такой EXEшник в Windows:
Цитата:
Код:
 Содержимое папки C:\Windows\System32

14.07.2009  04:38            18*432 attrib.exe
поэтому можно использовать эту команду БЕЗ cmd.exe
Код:
ShellExecute(Handle, nil, 'attrib', '-R-A-S-H C:\folder /D', nil, SW_SHOW);
но, кстати, скорее и через cmd.exe тоже запуск отработает без проблем.

И не вижу не одной причины, по которой Вы не можете запустить эти команды в Delphi
и проверить, как это работает.
И работает ли вообще.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.10.2018, 17:27   #5
TEKTON
Пользователь
 
Регистрация: 19.01.2011
Сообщений: 10
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
..
И не вижу не одной причины, по которой Вы не можете запустить эти команды в Delphi
и проверить, как это работает.
И работает ли вообще.
Не добрался ещё
Доберуся, буду пробовать.
Надеюсь всё будет работать
Спасибо!
TEKTON вне форума Ответить с цитированием
Старый 22.10.2018, 23:46   #6
TEKTON
Пользователь
 
Регистрация: 19.01.2011
Сообщений: 10
По умолчанию

Ерунда какая то
Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils, ShellApi;
var
  sparam:string;
 Code:integer;
begin
 sparam := 'del /S/F/Q %USERPROFILE%\AppData\Local\Temp\*.*';
// Code:=ShellExecute(Handle, nil, 'cmd.exe', PChar(sparam), nil, SW_SHOW);
 Code:=ShellExecute(0, nil, 'cmd.exe', PChar(sparam), nil, 0);
 Writeln(Inttostr(Code));
 ReadLn;
end.
Стал ругаться на "Handle" и "SW_SHOW".
Заменяю нулями, компилится.
Но не работает!
При выполнении в консоли появляется число 42
И на этом всё.
Пробовал и копирование и другие команды...
Не пашет!

Последний раз редактировалось TEKTON; 22.10.2018 в 23:49.
TEKTON вне форума Ответить с цитированием
Старый 23.10.2018, 00:47   #7
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Для cmd.exe не так команды задаются. Через ключ /C
Black Fregat вне форума Ответить с цитированием
Старый 23.10.2018, 07:33   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
Для cmd.exe не так команды задаются. Через ключ /C
Ага, Вы правы, точно так.

и по ссылке, которую я приводил выше https://stackoverflow.com/questions/...gram-in-delphi полно примеров.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.10.2018, 08:12   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от TEKTON Посмотреть сообщение
Стал ругаться на "Handle" и "SW_SHOW".
Handle у Вас отстуствует, потому как проект консольный.
И тут можно использовать ноль.

а вот SW_SHOW заменили не корректно.
Да и не нужно было заменять, достаточно было просто дописать в uses модуль Windows

Код:
program ClearLocalTemp;

{$APPTYPE CONSOLE}

uses
  SysUtils, Windows, ShellApi;
var
 sparam:string;
 Code:integer;
begin
 sparam := '/C del /S/F/Q %USERPROFILE%\AppData\Local\Temp\*.*';
 Code:=ShellExecute(0, nil, 'CMD.EXE ', PChar(sparam), nil, SW_SHOW);
 Writeln('Exit code = '+Inttostr(Code));
 ReadLn;
end.
p.s. 42 - это код нормально завершения.

p.p.s. "вишенка" на торте - ознакомьтесь со статьёй GunSmoker'а
Почему вам (никогда) не следует использовать ShellExecute и WinExec
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.10.2018, 08:30   #10
TEKTON
Пользователь
 
Регистрация: 19.01.2011
Сообщений: 10
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
Для cmd.exe не так команды задаются. Через ключ /C
Рад за Вас господа, что Вы это знаете
Но хотелось бы и за себя порадоваться, когда и я это узнаю (если узнаю ).
Но это будет не скоро, т.к. все намёками, да иносказаниями...
Что за чудный ключ "/C"?
Откуда он берётся?
Для чего ?

Пока печатал, ешё пост добавился

Пошёл лакомиться "вишенкой" на торте
Надеюсь она будет не кислой.

Последний раз редактировалось TEKTON; 23.10.2018 в 08:38.
TEKTON вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
выполнение cmd команды и получение рез-та в memo ziztracer Общие вопросы Delphi 17 08.02.2016 20:44
Выполнение команды CMD и получение вывода Janger Общие вопросы Delphi 4 09.10.2014 09:02
Команды в консоли Volkogriz Общие вопросы Delphi 14 30.01.2014 20:07
Выполнение команды cmd из VBA word Bublic Microsoft Office Word 2 23.04.2013 20:20
Перехват сообщения от консоли (cmd.exe) volod3000 Win Api 2 04.02.2009 09:29