Topic: Отправить текст в консоль windows

Доброго времени суток!
Подскажите как мне отправить текст в консоль?

cmd := 'строка которую требуется отправить в консоль';
Wcmd := FindWindow('', 'c:\windows\system32\cmd.exe');
    for i := 1 to Length(cmd) do
    begin
        PostMessage(Wcmd,WM_KEYDOWN,Ord(cmd[i]),0);
        Sleep(50);
    end;
    //PostMessage(Wcmd,WM_KEYDOWN,VK_RETURN,0);

Этот код работает, но в консоль приходит не то, что я отправляю. Предполагаю что должен быть не WM_KEYDOWN, а WM_CHAR, но на такое решение ругается компилятор.

Re: Отправить текст в консоль windows

А что именно требуется сделать?

Re: Отправить текст в консоль windows

У меня есть скрипт (уже скомпилирован в ехе), которому нужно при запуске передать параметры. Просто OpenFile(cmd) не срабатывает /cmd это строка содержащая путь к скрипиу и параметры
Если делаю OpenFile('cmd.exe'), то открывается консоль куда можно строку вставить из буфера и выполнить.
Собственно задача передать команду в консоль посимвольно. Примеры в интернете указывают что нужно в PostMessage использовать WM_CHAR вместо WM_KEYDOWN, но WM_CHAR в среде разработки нет (возможно можно нет алиаса текстового, но тогда нужено знать позицию WM_CHAR в массиве параметров (для WM_KEYDOWN позиция 255)

Re: Отправить текст в консоль windows

indigen wrote:

нужено знать позицию WM_CHAR в массиве параметров

WM_CHAR = 258; 

Но мне кажется, есть более изящное решение, чем:

FindWindow('', 'c:\windows\system32\cmd.exe');

через OLE например.

5 (edited by indigen 2023-08-20 18:53:51)

Re: Отправить текст в консоль windows

Спасибо! Задача решена. Мне нужно было рабочее решение, не до элегантности.
Но пару вопросов добавлю:
1. Где нужно было искать код WM_CHAR? (Это для общего развития)
2. Можно как-то отловить окончание выполнения задачи в консоли?

Re: Отправить текст в консоль windows

vovka3003 wrote:

Но мне кажется, есть более изящное решение, чем:

FindWindow('', 'c:\windows\system32\cmd.exe');

через OLE например.

Добрый день. А как через OLE, например?

7 (edited by vovka3003 2023-08-21 09:54:32)

Re: Отправить текст в консоль windows

indigen wrote:

..нужно было рабочее решение, не до элегантности..

Просто есть вероятность поймать "не то" окно. Ну и в процессе выполнения если его тронете - выполнение прекратится.

indigen wrote:

1. Где нужно было искать код WM_CHAR? (Это для общего развития)

https://gitlab.com/freepascal.org/fpc/s … heads#L973

indigen wrote:

2. Можно как-то отловить окончание выполнения задачи в консоли?

В данном способе - никак. В MVDb не реализованы нужные функции, а если бы и были - это получился бы еще один условно работающий "костыль".

Re: Отправить текст в консоль windows

newusr wrote:

А как через OLE, например?

procedure Test; // с выводом
var objShell,objExec,objADODB:variant;
    strBuf:string;
begin
    try
     objShell := CreateOleObject('WScript.Shell');
     objExec := objShell.Exec('cmd');
     objExec.StdIn.WriteLine('ping ya.ru && ping google.ru && exit' {без exit не закроется консоль из-за .ReadAll});
    strBuf := objExec.StdOut.ReadAll;
    objADODB := CreateOleObject('ADODB.Stream');
    objADODB.Open;
    objADODB.Charset := 'Windows-1251';
    objADODB.WriteText(strBuf);
    objADODB.Position := 0;
    objADODB.Charset := 'IBM866';
    strBuf := objADODB.ReadText;
    objADODB.Close;
    objExec.Terminate();
    ShowMessage(strBuf);
   finally
    objShell := 0;
    objExec  := 0;
    strBuf := '';
    objADODB := 0;
   end;
end;

procedure Test2; // без вывода
var objShell,objExec,objADODB:variant;
begin
    try
     objShell := CreateOleObject('WScript.Shell');
     objExec := objShell.Exec('cmd');
     objExec.StdIn.WriteLine('calc');
     objExec.StdIn.WriteLine('notepad');
     objExec.Terminate();
   finally
    objShell := 0;
    objExec  := 0;
   end;
end;

Еще возможно более гибко можно было бы через WMI с помощью класса Win32_Process.
Но это уже другая история...

Re: Отправить текст в консоль windows

Это получается, что в строке

objExec := objShell.Exec('cmd');

команду cmd можно заменить на plink и должно сработать?
Я имею в виду, что можно в консоль plink.exe также отправлять команды и получать ответ?

Re: Отправить текст в консоль windows

Теоретически да.