Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
1 / 1 / 0
Регистрация: 01.11.2018
Сообщений: 23
1

Ввод значения переменной в команду консоли CMD

14.06.2019, 14:09. Показов 2289. Ответов 16

Author24 — интернет-сервис помощи студентам
Доброго времени суток, возникла такая проблема: пишу программу для себя по прошивке телефона, в частности, рекавери раздела. Вот команда:
Delphi
1
WinExec('cmd /c "start fastboot.exe flash  recovery' +edt1.text+ ', 0);
.
Здесь edt1.text – адрес .img образа с рекавери, который берется из папки. Как передать его значение в консоль?. Пробовал делать через разные процедуры: ShellExecute, CreateProcess, но безуспешно. Так же очень хочется сделать вывод данных с консоли в мемо, пробовал через создание лога консоли и подгрузки в мемо но там кодировка не совпадает и вообще похоже на очень большой костыль.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.06.2019, 14:09
Ответы с готовыми решениями:

Ввод значения целочисленной переменной из консоли
Доброго времени суток. Вот проблемная часть кода: ... setlocale(LC_ALL, "Russian"); int a;...

Cmd.exe, как получить ответ консоли на команду?
программа выполняет консольную команду через Process x = Runtime.getRuntime().exec("команда"); как...

Ввод значения в функцию класса пользователем (с консоли)
Все привет. Столкнулся с проблемой. К примеру есть класс: class Employee { private: int age;...

Вывод значения переменной, занимающей определенное количество символов, в консоли
Как вывести в консоли значения переменных, что бы они занимали одинаковое расстояние от начала...

16
5489 / 4404 / 1077
Регистрация: 29.08.2013
Сообщений: 27,605
Записей в блоге: 3
14.06.2019, 14:31 2
путь из эдита в кавычках
после recovery тоже кавычки

Цитата Сообщение от F1bonacc1 Посмотреть сообщение
и вообще похоже на очень большой костыль.
точно
0
5860 / 4588 / 1448
Регистрация: 14.04.2014
Сообщений: 20,358
Записей в блоге: 20
14.06.2019, 14:55 3
про пробелы не забываем, да
0
1 / 1 / 0
Регистрация: 01.11.2018
Сообщений: 23
14.06.2019, 15:05  [ТС] 4
Цитата Сообщение от qwertehok Посмотреть сообщение
путь из эдита в кавычках
после recovery тоже кавычки
не совсем понимаю как. Можете показать?
0
5489 / 4404 / 1077
Регистрация: 29.08.2013
Сообщений: 27,605
Записей в блоге: 3
14.06.2019, 16:22 5
Delphi
1
WinExec('cmd /c "start fastboot.exe flash  recovery ' +quotedstr(edt1.text)+ ', 0);
после recovery пробел я хотел сказать
0
1 / 1 / 0
Регистрация: 01.11.2018
Сообщений: 23
14.06.2019, 17:23  [ТС] 6
qwertehok, Не компилится код. Дает две ошибки: "[Error] Unit3.pas(43): Unterminated string" и "[Error] Unit3.pas(44): Incompatible types: 'String' and 'PAnsiChar' ".
0
3050 / 1668 / 657
Регистрация: 19.03.2019
Сообщений: 5,370
14.06.2019, 17:41 7
Цитата Сообщение от F1bonacc1 Посмотреть сообщение
qwertehok, Не компилится код. Дает две ошибки: "[Error] Unit3.pas(43): Unterminated string" и "[Error] Unit3.pas(44): Incompatible types: 'String' and 'PAnsiChar' ".
пробуй так
Delphi
1
WinExec(PChar('cmd /c "start fastboot.exe flash  recovery ' +quotedstr(edt1.text)), 0);
слушай, последний нолик в процедуре WinExec это SW_HIDE = 0;
А зачем тебе прятать выполнение консоли?
поставь там SW_Normal

или вообще используйте CreateProcess и запускай в нём напрямую fastboot.exe с нужными параметрами.
Зачем тебе запуск через командный процессор?
0
1 / 1 / 0
Регистрация: 01.11.2018
Сообщений: 23
14.06.2019, 18:05  [ТС] 8
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
А зачем тебе прятать выполнение консоли?
поставь там SW_Normal
Потому что вывод должен по идеи идти в мемо

Добавлено через 14 минут
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
пробуй так
В общем, приложение запустилось, но так и не заработало. Проверил еще раз синтаксис консоли – все команды правильно введены. Попробую еще раз через CreateProcess
0
3050 / 1668 / 657
Регистрация: 19.03.2019
Сообщений: 5,370
14.06.2019, 18:09 9
Цитата Сообщение от F1bonacc1 Посмотреть сообщение
Потому что вывод должен по идеи идти в мемо
смешно.
от того, что ты спрячешь запуск, вывод в Мемо сам по себе не пойдёт.

Добавлено через 1 минуту
Цитата Сообщение от F1bonacc1 Посмотреть сообщение
В общем, приложение запустилось, но так и не заработало. Проверил еще раз синтаксис консоли – все команды правильно введены. Попробую еще раз через CreateProcess
перед запуском обязательно сделай текущей папку, где у тебя всё лежит (fastboot.exe, например)
0
1 / 1 / 0
Регистрация: 01.11.2018
Сообщений: 23
14.06.2019, 18:15  [ТС] 10
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
от того, что ты спрячешь запуск, вывод в Мемо сам по себе не пойдёт.
Дак оно понятно.Оно работает по принципу сохранения инфы с консоли в текстовый файл, а оттуда уже мемо его загружает.
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
перед запуском обязательно сделай текущей папку, где у тебя всё лежит (fastboot.exe, например)
Хорошо, сделаю.
0
337 / 173 / 68
Регистрация: 25.02.2018
Сообщений: 616
14.06.2019, 18:51 11
F1bonacc1, Версия Delphi какая?
0
1 / 1 / 0
Регистрация: 01.11.2018
Сообщений: 23
14.06.2019, 19:17  [ТС] 12
Ашотик2018, 7
0
5489 / 4404 / 1077
Регистрация: 29.08.2013
Сообщений: 27,605
Записей в блоге: 3
14.06.2019, 19:30 13
Цитата Сообщение от F1bonacc1 Посмотреть сообщение
"[Error] Unit3.pas(44): Incompatible types: 'String' and 'PAnsiChar' ".
если ты не можешь перевести ошибку, то рано тебе еще
делай тесты и калькуляторы
0
1 / 1 / 0
Регистрация: 01.11.2018
Сообщений: 23
14.06.2019, 19:41  [ТС] 14
qwertehok, если вы такой токсичный, уйдите, пожалуйста из темы, а ещё лучше прочтите название раздела. И перестаньте быть таким высокомерным. Все с чего-то когда-то начинали. Мне интересна эта тема и я ей занимаюсь.
0
5489 / 4404 / 1077
Регистрация: 29.08.2013
Сообщений: 27,605
Записей в блоге: 3
14.06.2019, 21:03 15
Цитата Сообщение от F1bonacc1 Посмотреть сообщение
Мне интересна эта тема и я ей занимаюсь.
ну так переведите ошибку - 5 слов на английском, что может быть проще

Цитата Сообщение от F1bonacc1 Посмотреть сообщение
Все с чего-то когда-то начинали.
с учебников, а вы их пропустили
0
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
14.06.2019, 22:47 16
Цитата Сообщение от F1bonacc1 Посмотреть сообщение
WinExec
Просто оставлю это здесь: https://www.cyberforum.ru/post10316633.html (вторая половина поста).
0
337 / 173 / 68
Регистрация: 25.02.2018
Сообщений: 616
15.06.2019, 13:16 17
Поскольку у меня нет необходимости работать с Android-ом, я скачал не последнюю версию FastBoot (platform-tools_r23.1), пробовал запускать её, и она отработала нормально, запустилась и в Memo вывела текст команды "Help" (см. скрин). Пробовал использовать данный вариант на другой консольной утилите, тоже всё хорошо, консоль отрабатывает, результат кидает в Memo, если соответственно ошибки или неправильные команды, всё это появится в Memo.
Попробуй, может так получится.
Код:
Delphi
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Edit1: TEdit;
    Label1: TLabel;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
  private
{ Private declarations }
  public
{ Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
function GetDosOutput(const CommandLine, Parametrs: string): string;
var
  SA: TSecurityAttributes;
  SI: TStartupInfo;
  PI: TProcessInformation;
  StdOutPipeRead, StdOutPipeWrite: THandle;
  WasOK: Boolean;
  Buffer: array[0..255] of Char;
  BytesRead: Cardinal;
  WorkDir, Line: string;
begin
  Application.ProcessMessages;
  with SA do
  begin
    nLength := SizeOf(SA);
    bInheritHandle := True;
    lpSecurityDescriptor := nil;
  end;
  // создаём пайп для перенаправления стандартного вывода
  CreatePipe(StdOutPipeRead,  // дескриптор чтения
    StdOutPipeWrite, // дескриптор записи
    @SA,              // атрибуты безопасности
    0                // количество байт принятых для пайпа - 0 по умолчанию
  );
  try
    // Создаём дочерний процесс, используя StdOutPipeWrite в качестве стандартного вывода,
    // а так же проверяем, чтобы он не показывался на экране.
    with SI do
    begin
      FillChar(SI, SizeOf(SI), 0);
      cb := SizeOf(SI);
      dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
      wShowWindow := SW_HIDE;
      hStdInput := GetStdHandle(STD_INPUT_HANDLE); // стандартный ввод не перенаправляем
      hStdOutput := StdOutPipeWrite;
      hStdError := StdOutPipeWrite;
    end;
    // Запускаем компилятор из командной строки
    WorkDir := ExtractFilePath(CommandLine);
    WasOK := CreateProcess(nil, PChar(CommandLine + ' ' + Parametrs), nil, nil, True, 0, nil, PChar(WorkDir), SI, PI);
    // Теперь, когда дескриптор получен, для безопасности закрываем запись.
    // Нам не нужно, чтобы произошло случайное чтение или запись.
    CloseHandle(StdOutPipeWrite);
    // если процесс может быть создан, то дескриптор, это его вывод
    if not WasOK then //raise Exception.Create('Could not execute command line!')
 
    else
    try
        // получаем весь вывод до тех пор, пока DOS-приложение не будет завершено
      Line := '';
      repeat
        Application.ProcessMessages;
          // читаем блок символов (могут содержать возвраты каретки и переводы строки)
        WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil);
          // есть ли что-нибудь ещё для чтения?
        if BytesRead > 0 then
        begin
              // завершаем буфер PChar-ом
          Buffer[BytesRead] := #0;
              // добавляем буфер в общий вывод
          Line := Line + Buffer;
        end;
      until not WasOK or (BytesRead = 0);
        // ждём, пока завершится консольное приложение
      WaitForSingleObject(PI.hProcess, INFINITE);
    finally
        // Закрываем все оставшиеся дескрипторы
      CloseHandle(PI.hThread);
      CloseHandle(PI.hProcess);
    end;
  finally
    result := utf8toansi(Line); // перекодируем UTF-8 в ANSI
    CloseHandle(StdOutPipeRead);
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  FBPar: string;
begin
  if OpenDialog1.Execute then
    // Выводим полный путь к файлу
    Edit1.Text := OpenDialog1.FileName;
  // Формируем команду для FastBoot с параметрами
  FBPar := ' flash  recovery ' + Edit1.Text;
  // Выполняем всё и выводим результат в Memo
  Memo1.Text := GetDosOutput(extractfilepath(paramstr(0)) + 'fastboot.exe ', FBPar);
end;
 
end.
Примечание:
Консольную утилиту, со всем её содержимым, я кидал в папку с программой, так проще всего. Если она стоит где-то отдельно (хотя она вроде бы не инсталлируется), то вместо 'fastboot.exe ' нужно будет прописывать на 'полный путь\fastboot.exe ', реально неудобно, лучше всё хранить в одной папке.
Файл IMG лучше хранить в папке где нет разрывов в пути к нему, т.е. если путь будет например "C:\Папка Васи Пупкина\123.img", то программа выбьет ошибку. Идеальный вариант, кидать его тоже в папку с программой, тогда можно вводить просто в Edit его название и убрать 110 - 112 строчки кода (из проекта удалить Opendialog).

Выглядит как-то так (вывод результата команды HELP утилиты FASTBOOT.EXE):
Ввод значения переменной в команду консоли CMD

Проект - Thread2471450-FastBoot.rar - Delphi 7.
2
15.06.2019, 13:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.06.2019, 13:16
Помогаю со студенческими работами здесь

Ввод значения символьной переменной
Здравствуйте. Подскажите пожалуйста, как в ЯВУ C осуществить ввод символа. Я пытался это сделать...

Ввод значения переменной вручную
Добрый день, нужна помощь. Хочу сделать так, что мною введённое значение переменной в батнике...

Предотвращение закрытия консоли при присваивании переменной значения неправильного типа
Здравствуйте. Я завёл в программе переменную типа int. При попытке присваивания ей значения char...

Ввод файла и присвоение значения переменной
Добрый вечер! Хотелось бы для себя прояснить нюансы, связанные с вводом файла и присвоением его...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru