С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.57/14: Рейтинг темы: голосов - 14, средняя оценка - 4.57
prog63
2 / 2 / 1
Регистрация: 24.11.2013
Сообщений: 77
1

C++ Выполнение команд

24.01.2014, 21:13. Просмотров 2535. Ответов 23
Метки нет (Все метки)

Суть задачи вот в чем: программа должна выполнять команды, прописанные в файле или переменной.

Примерно так работает командная строка cmd:
C:\Programms\Test>echo Текст
Текст
C:\Programms\Test>

Тоже самое нужно создать в программе на C++.
А именно :

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream.h>
#include <conio.h>
#include <vcl.h>
#pragma hdrstop
#pragma argsused
 
int main(int argc, char* argv[])
{
int Command;
cout<<"Enter command: ";                            //Вводим команду
cin>>Command;
 
try
{
 
...                                                            //Выполняем ее
 
}
catch(int)                                                 //Если ошибка
{
cout<<"Невозможная команда !";
getch();
}
        return 0;
}
И диалог должен быть таким :

Enter command: cout<<"Programm"; //Пишем cout
Programm

Конечно, кавычки в переменной недопустимы, поэтому я использую файл.
А вообще нужно создать "компилятор" программ на C++: написал программу в файл, считал и выполнил каждую команду.

Вопрос в том, как выполнить сами команды, и есть ли вообще такая возможность...

Заранее спасибо
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.01.2014, 21:13
Ответы с готовыми решениями:

Выполнение JavaScript команд на сайте
Доброго времени суток! Собственно, задача у меня такая: Необходимо открыть...

C++ Builder 6 Выполнение в коде программы bat команд
Доброго времени суток. Появилась нужда написать мелкую программу есть код из...

Таблица команд
Скиньте пожалуйста таблицу команд , для чайников ))

Распознавание речи(+ команд)
привет!!) вопрос такой - при помощи чего можно распознавать речь, какие есть...

Передача команд в cmd.exe
Добрый вечер, участники форума! Столкнулся с такой проблемой. Существует...

23
Lelik-pahan
1364 / 782 / 175
Регистрация: 25.11.2009
Сообщений: 1,597
Завершенные тесты: 1
24.01.2014, 21:25 2
Цитата Сообщение от prog63 Посмотреть сообщение
Конечно, кавычки в переменной недопустимы
кавычки конечно допустимы, просто их нужно экранировать слешем. "\"текстВкавычках\""
Цитата Сообщение от prog63 Посмотреть сообщение
А вообще нужно создать "компилятор" программ на C++: написал программу в файл, считал и выполнил каждую команду
Причём тут компилятор? скорее интерпретатор.
и почему именно программа на c++ и именно своя, с нуля? Есть же скриптовые языки
Цитата Сообщение от prog63 Посмотреть сообщение
Вопрос в том, как выполнить сами команды
Для начала нужно определиться с перечнем команд, которые нужно выполнять. Да и вообще не понятна цель программы.
0
prog63
2 / 2 / 1
Регистрация: 24.11.2013
Сообщений: 77
24.01.2014, 21:34  [ТС] 3
Цитата Сообщение от Lelik-pahan Посмотреть сообщение
Для начала нужно определиться с перечнем команд, которые нужно выполнять
Список команд хранится в файле
0
Lelik-pahan
1364 / 782 / 175
Регистрация: 25.11.2009
Сообщений: 1,597
Завершенные тесты: 1
24.01.2014, 21:37 4
Цитата Сообщение от prog63 Посмотреть сообщение
Список команд хранится в файле
как эта информация может форумчанам помочь тебе? )
Если ты просишь помочь запрограммировать выполнение команд, то скажи, какие именно команды нужно выполнять.
и
Цитата Сообщение от Lelik-pahan Посмотреть сообщение
почему именно программа на c++ и именно своя, с нуля? Есть же скриптовые языки
0
prog63
2 / 2 / 1
Регистрация: 24.11.2013
Сообщений: 77
24.01.2014, 21:47  [ТС] 5
Цитата Сообщение от Lelik-pahan Посмотреть сообщение
Если ты просишь помочь запрограммировать выполнение команд, то скажи, какие именно команды нужно выполнять.
Вот именно, если бы я знал, какие будут выполняться команды, то просто воспользовался бы оператором switch

Добавлено через 2 минуты
Цитата Сообщение от Lelik-pahan Посмотреть сообщение
Да и вообще не понятна цель программы.
Вообще я делаю менеджер задач.
И для этого мне нужно иметь собственный язык программирования (с учетом тех задач, которые мне нужно выполнять)
0
Lelik-pahan
1364 / 782 / 175
Регистрация: 25.11.2009
Сообщений: 1,597
Завершенные тесты: 1
24.01.2014, 21:49 6
если даже ты не знаешь, какие должны выполняться команды, то ты хочешь создать искусственный интеллект.

Добавлено через 1 минуту
Цитата Сообщение от prog63 Посмотреть сообщение
Вообще я делаю менеджер задач.
И для этого мне нужно иметь собственный язык программирования (с учетом тех задач, которые мне нужно выполнять)
Ты говоришь слишком абстрактно. Приведи пример какой-нибудь типовой задачи, которую хочешь решать своим менеджером.
И собственный язык программирования... мне кажется ты слишком размахнулся
0
prog63
2 / 2 / 1
Регистрация: 24.11.2013
Сообщений: 77
24.01.2014, 22:02  [ТС] 7
Цитата Сообщение от prog63 Посмотреть сообщение
Вообще я делаю менеджер задач.
Была где-то в далеком прошлом система САВВИ. Вот что-то подобное я делаю

Добавлено через 5 минут
Пример диалога:

Копировать документы
Задача "Копировать документы" не определена. Создать новую ?
y
Задача "Копировать документы":
Copy(D:\Documents - E:\Documents)
end
Задача "Копировать документы" создана

А дальше я могу либо написать уже приведенную команду Copy, либо написать:
Копировать документы

И вот теперь Manager превратит мою задачу в программу на C++ и выполнит ее.

Добавлено через 1 минуту
Вот зачем мне нужно выполнение команд из файла (Копировать документы.task)

Добавлено через 2 минуты
Цитата Сообщение от Lelik-pahan Посмотреть сообщение
если даже ты не знаешь, какие должны выполняться команды, то ты хочешь создать искусственный интеллект.
Не совсем, но что-то похожее на это

Добавлено через 2 минуты
Цитата Сообщение от Lelik-pahan Посмотреть сообщение
И собственный язык программирования... мне кажется ты слишком размахнулся
Не знаю, но писать обычные программки на выполнение математических действий, работу с массивами и файлами как-то скучно
0
Lelik-pahan
1364 / 782 / 175
Регистрация: 25.11.2009
Сообщений: 1,597
Завершенные тесты: 1
24.01.2014, 22:07 8
Прошу прощения за пессимизм, но вряд ли ты напишешь программу, которая будет превращать твою команду в программу с++ и выполнять её... А вот научить свою программу просто выполнять эти команды, на мой взгляд, вполне разрешимая задача.

Мне видится такой алгоритм разработки приложения:
1. Определить перечень команд, которые необходимо выполнять. Начать можно с одной, например та же самая "Copy"
2. Научит программу "понимать" эту команду. т. е. разбивать на составляющие - команда, параметры. И правильно её выполнять.
3. уже после этого можно добавить алгоритм создания "псевдонимов" для команд, которые будут где-то храниться.
0
prog63
2 / 2 / 1
Регистрация: 24.11.2013
Сообщений: 77
24.01.2014, 22:09  [ТС] 9
А все-таки, как выполнять команды?

Добавлено через 1 минуту
Именно с этими 3 пунктами у меня проблем нет
0
Lelik-pahan
1364 / 782 / 175
Регистрация: 25.11.2009
Сообщений: 1,597
Завершенные тесты: 1
24.01.2014, 22:31 10
как я говорил, нужно определиться с перечнем команд, тогда можно будет придумать синтаксис.
если предположить, что все команды имеют формат команда(параметр1 - параметр2) , то вот пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    execComand("Copy(D:\Documents - E:\Documents)");
}
//---------------------------------------------------------------------------
bool TForm1::execComand(String input)
{
    String comand, parametr1, parametr2;
    comand = input.SubString(1, input.Pos("(") - 1);
    parametr1 = input.SubString(input.Pos("(") + 1, input.Pos(" - ") - 1);
    parametr2 = input.SubString(input.Pos(" - ") + 4, input.Pos(")") - 1);
 
    if (comand == "Copy")
    {
        return CopyFile(parametr1.c_str(), parametr2.c_str(), true);
    }
    else
    {
        ShowMessage("Неизвестная команда");
        return false;
    }
 
    return false;
}
вообще такая обработка довольно примитивна. Она сложна в реализации и долго выполняется. Почитай про регулярные выражения, это должно пригодиться

Добавлено через 2 минуты
Так же здесь можно добавить проверку на существование файла D:\Documents.
Если в названии файлов могут использоваться символы, которые я принял за разделители - "(", " - ", ")", то следует ввести экранирование (стаффинг) для этих симолов

Добавлено через 2 минуты
а с третим пунктом действительно проблем нет. Если у тебя есть функция, способная выполнить "Copy(D:\Documents - E:\Documents)", то не составит труда найти в таблице с псевдонимами, что текст "Копировать документы" соответствует этой команде, а уж её выполнять мы умеем
0
prog63
2 / 2 / 1
Регистрация: 24.11.2013
Сообщений: 77
24.01.2014, 22:41  [ТС] 11
Это фрагмент компилятора

Добавлено через 1 минуту
Цитата Сообщение от Lelik-pahan Посмотреть сообщение
а с третим пунктом действительно проблем нет. Если у тебя есть функция, способная выполнить "Copy(D:\Documents - E:\Documents)", то не составит труда найти в таблице с псевдонимами, что текст "Копировать документы" соответствует этой команде, а уж её выполнять мы умеем
Да. Именно так работает упомянутая система САВВИ

Добавлено через 5 минут
в

C++
1
2
CopyFile(D:\Documents - E:\Documents);
cout<<"Завершено";
И что дальше ?

Добавлено через 27 секунд
ой простите не то написал
0
Lelik-pahan
1364 / 782 / 175
Регистрация: 25.11.2009
Сообщений: 1,597
Завершенные тесты: 1
24.01.2014, 22:42 12
Цитата Сообщение от prog63 Посмотреть сообщение
Это фрагмент компилятора
Цитата Сообщение от Wikipedia
Компиляция — трансляция программы, составленной на исходном языке высокого уровня, в эквивалентную программу на низкоуровневом языке, близком машинному коду (абсолютный код, объектный модуль, иногда на язык ассемблера)
где ты такое увидел в приведённом коде?

Вот если ты в билдере нажмёшь Alt + F9, это да, компиляция
0
prog63
2 / 2 / 1
Регистрация: 24.11.2013
Сообщений: 77
24.01.2014, 22:48  [ТС] 13
короче говоря, компилятор преобразует программу

C++
1
2
Копировать (D:\Documents - E:\Documents)
Вывести "Ended"
в программу на C++:

C++
1
2
CopyFile(D:\Documents - E:\Documents);
cout<<"Завершено";
И вот эта программа лежит в файле Programm
Вопрос: как ее выполнить ?

Добавлено через 2 минуты
Цитата Сообщение от Lelik-pahan Посмотреть сообщение
Компиляция — трансляция программы, составленной на исходном языке высокого уровня, в эквивалентную программу на низкоуровневом языке, близком машинному коду (абсолютный код, объектный модуль, иногда на язык ассемблера)
Ну да, согласен.

Добавлено через 35 секунд
Цитата Сообщение от prog63 Посмотреть сообщение
И вот эта программа лежит в файле Programm
Вопрос: как ее выполнить ?
???
0
Lelik-pahan
1364 / 782 / 175
Регистрация: 25.11.2009
Сообщений: 1,597
Завершенные тесты: 1
24.01.2014, 23:01 14
Программа - пример, которую я привёл ничего не компилирует! Разберись в терминологии. Программа анализирует твою команду и тут же сама выполнят действие, которое ты ожидаешь.

Цитата Сообщение от prog63 Посмотреть сообщение
И вот эта программа лежит в файле Programm
Вопрос: как ее выполнить ?
если Programm - это исполняемый exe файл, то можно запустить его на выполнение с помощью ShellExecute или CreateProcess (поиск по форуму поможет).

если Programm - это текстовый файл, в котором записана команда, то есть функции OpenFile, LoadFromFile и др.
Опять таки поиск выдаст вариантов множество,

Добавлено через 6 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TStringList *comandList = new TStringList();
    comandList->LoadFromFile("C:\\Programm");  //загружаем команды из файла
 
    for (unsigned int i = 0; i < comandList->Count; i++)  //проходим по всем строкам
        execComand(comandList->Strings[i].Trim());  //выполняем каждую команду
 
    delete comandList;
}
//---------------------------------------------------------------------------
bool TForm1::execComand(String input)
{
    String comand, parametr1, parametr2;
    comand = input.SubString(1, input.Pos("(") - 1);
    parametr1 = input.SubString(input.Pos("(") + 1, input.Pos(" - ") - 1);
    parametr2 = input.SubString(input.Pos(" - ") + 4, input.Pos(")") - 1);
 
    if (comand == "Copy")
    {
        return CopyFile(parametr1.c_str(), parametr2.c_str(), true);
    }
    else
    {
        ShowMessage("Неизвестная команда");
        return false;
    }
 
    return false;
}
0
prog63
2 / 2 / 1
Регистрация: 24.11.2013
Сообщений: 77
24.01.2014, 23:03  [ТС] 15
Файл Programm содержит уже преобразованную на C++ программу:
C++
1
2
CopyFile(D:\Documents - E:\Documents);
cout<<"Завершено";
Которую я сделал из:
C++
1
2
Копировать (D:\Documents - E:\Documents)
Вывести "Ended"
И вот команды CopyFile и cout (это работающие команды на языке C++) со всеми параметрами и нужно выполнить !
То есть:
Считать строку из файла Programm
Эта строка - CopyFile(D:\Documents - E:\Documents);
Выполнить ее
Опять считать строку из файла Programm
Это - cout<<"Завершено";
Выполнить
И так далее, пока не будет достигнут конец файла.
А вот как ВЫПОЛНИТЬ команду ?

Добавлено через 1 минуту
Цитата Сообщение от Lelik-pahan Посмотреть сообщение
return CopyFile(parametr1.c_str(), parametr2.c_str(), true);
Что вообще делает return ?
0
Lelik-pahan
1364 / 782 / 175
Регистрация: 25.11.2009
Сообщений: 1,597
Завершенные тесты: 1
24.01.2014, 23:11 16
Цитата Сообщение от prog63 Посмотреть сообщение
Файл Programm содержит уже преобразованную на C++ программу
Цитата Сообщение от prog63 Посмотреть сообщение
Считать строку из файла Programm
Эта строка - CopyFile(D:\Documents - E:\Documents);
это полное противоречие.
Если у тебя есть текстовый файл, в котором написано
Цитата Сообщение от prog63 Посмотреть сообщение
CopyFile и cout
, этот файл вовсе не является программой! Максимум, так он сойдёт за исходник.

Добавлено через 5 минут
Цитата Сообщение от prog63 Посмотреть сообщение
Добавлено через 1 минуту
Сообщение от Lelik-pahan
return CopyFile(parametr1.c_str(), parametr2.c_str(), true);
Что вообще делает return ?
return возвращает значение.

CopyFile - булева функция, которая возвращает true при удачном выполнении и false, если выполнить команду не получилось.

свою функцию execComand я тоже сделал булевой. В итоге она вернёт то же значение, что и вернула функция CopyFile .
строку
C++
1
return CopyFile(parametr1.c_str(), parametr2.c_str(), true);
можно записать как
C++
1
2
bool rezult = CopyFile(parametr1.c_str(), parametr2.c_str(), true);
return rezult;
0
prog63
2 / 2 / 1
Регистрация: 24.11.2013
Сообщений: 77
24.01.2014, 23:33  [ТС] 17
Цитата Сообщение от prog63 Посмотреть сообщение
Файл Programm содержит уже преобразованную на C++ программу:
Код C++
1
2
CopyFile(D:\Documents - E:\Documents);
cout<<"Завершено";
Которую я сделал из:
Код C++
1
2
Копировать (D:\Documents - E:\Documents)
Вывести "Ended"
И вот команды CopyFile и cout (это работающие команды на языке C++) со всеми параметрами и нужно выполнить !
То есть:
Считать строку из файла Programm
Эта строка - CopyFile(D:\Documents - E:\Documents);
Выполнить ее
Опять считать строку из файла Programm
Это - cout<<"Завершено";
Выполнить
И так далее, пока не будет достигнут конец файла.
Цитата Сообщение от prog63 Посмотреть сообщение
А вот как ВЫПОЛНИТЬ команду ?
Вот в чем вопрос.

Добавлено через 9 минут
К примеру, что бы выполнить команду cmd для очистки экрана, можно написать system("cls");
Прямо в программе.

А вот как, например, скопировать файл такой же командой.
Я имею в виду:
C++
1
2
int Comanda = "getch();";           //Команда паузы
Run(Comanda);                         //Есть ли такой оператор?
Run(Comanda); по идее должен быть еквивалентен getch();, поскольку "getch();" записано в Comanda
Вопрос в том, есть ли такой оператор, похожий на Run(); ?
0
Lelik-pahan
1364 / 782 / 175
Регистрация: 25.11.2009
Сообщений: 1,597
Завершенные тесты: 1
25.01.2014, 12:07 18
Цитата Сообщение от prog63 Посмотреть сообщение
И вот команды CopyFile и cout (это работающие команды на языке C++)
CopyFile - это команда WinApi, а не c++.
Цитата Сообщение от prog63 Посмотреть сообщение
Сообщение от prog63
А вот как ВЫПОЛНИТЬ команду ?
Вот в чем вопрос.
Я уже привёл тебе пример программы, которая открывает текстовый файл, проходит по всем его строка и передаёт их по очереди обработчику команд, который их и выполняет. Для каждой команды нужно самому реализовать её обработку, обработка copy у тебя уже есть.

Цитата Сообщение от prog63 Посмотреть сообщение
Run(Comanda);
Такого в c++ нет. Ты, конечно можешь передавать все строки из файла в system("...");, но какой смысл? проще просто использовать bat-файл. Или пиши свои команды на VBScript и сохраняй в файл с расширением vbs, такие скрипты ОС выполнит сама.
0
prog63
2 / 2 / 1
Регистрация: 24.11.2013
Сообщений: 77
25.01.2014, 12:41  [ТС] 19
Цитата Сообщение от Lelik-pahan Посмотреть сообщение
CopyFile - это команда WinApi, а не c++.
Хм, а я думал, что это команда c++

Добавлено через 3 минуты
Цитата Сообщение от Lelik-pahan Посмотреть сообщение
проще просто использовать bat-файл
В bat файле невозможно выполнить некоторые команды, например организовать ввод.
Возможно, когда-то программа станет визуальной, и тогда bat будет безуспешно пытаться растянуть форму или скрыть кнопку
Так что bat-файл не подходит

Добавлено через 1 минуту
Цитата Сообщение от Lelik-pahan Посмотреть сообщение
Или пиши свои команды на VBScript и сохраняй в файл с расширением vbs, такие скрипты ОС выполнит сама.
Вот это другое дело.
Но я не знаком с VBScript. Это вроде что-то из Visual Basic?
И как с такими "скриптами" работать?

Добавлено через 3 минуты
Насчет VBScript..
Программа должна преобразовать "задачу" в программу на VisualBasic и сохранить ее в файл *.vbs
Правильно ли я понял?
А потом она должна ее запустить. А как? Через ShellExecute?

Добавлено через 18 минут
Вообще, что должна делать моя программа?
Вроде так:

1 Цикл (пока не обнаружен конец файла-eof)
2 Считать символ и добавить в Bufer.
3 Анализ содержимого переменной Bufer.
4 Если это какая-то команда, считывать дальше до получения символа конца строки.
(Поясню-у команды такая структура:Человек пишет "Вывести Abc", и сразу при вводе программа добавляет в файл *.task строку "Вывести Abc"и символ конца строки)
5 Полученные параметры ("Abc") записать в Parameters
6 На основе названия команды и содержимого Parameters создать команду (VBScript) и записать ее в файл *.vbs
7 Конец цикла

Теперь в файле *.vbs находится программа (на языке VBScript)

И когда нужно будет выполнить файл *.task, запустить программу из файла *.vbs
Все

Я правильно все понял?
0
Lelik-pahan
1364 / 782 / 175
Регистрация: 25.11.2009
Сообщений: 1,597
Завершенные тесты: 1
25.01.2014, 13:30 20
Цитата Сообщение от prog63 Посмотреть сообщение
Насчет VBScript..
Программа должна преобразовать "задачу" в программу на VisualBasic и сохранить ее в файл *.vbs
Правильно ли я понял?
Нет, я говорил о том, чтобы не писать команды "на своём языке", а сразу писать скрипт. И не нужно никакой программы для преобразования.
Цитата Сообщение от prog63 Посмотреть сообщение
В bat файле невозможно выполнить некоторые команды,
В bat-файле возможно всё, что позволяет делать ОС, вопрос умения.
Цитата Сообщение от prog63 Посмотреть сообщение
Но я не знаком с VBScript
я тоже. Но если перед тобой есть задача, то можно и познакомиться.
Вариант с VBScript подразумевает использование только VBScript, и не нужно писать никакой программы на C++.

Цитата Сообщение от prog63 Посмотреть сообщение
1 Цикл (пока не обнаружен конец файла-eof)
я же написал, вот проход по всем строкам файла, до самого конца.
Цитата Сообщение от Lelik-pahan Посмотреть сообщение
for (unsigned int i = 0; i < comandList->Count; i++) //проходим по всем строкам
Почему ты так зациклился на преобразовании команд в некий исполняемый файл? Почему нельзя просто выполнять эти команды своей программой?
Я же привёл тебе уже работающий код программы, которая открывай файл, считывает команду из каждой строки и выполняет её. Сейчас она может выполнять только команду copy(что - куда). Нужны другие команды - добавь их обработку.
0
25.01.2014, 13:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.01.2014, 13:30

Как написать интерпретатор команд?
С примером

Совместимость компонентов и команд Win XP - 7. TStringGrid
Работаю в C++Builder 2009. Пишу многопоточное приложения для работы с COM...

Работа с USB устройством (посылка и прием команд)
Хочу сделать устройство, которое будет общаться с компом через USB порт (на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru