2013-04-04 6 views
2

Я пытаюсь прочитать stdout Windows CMD с помощью AutoHotkey. Например, я хотел бы получить вывод команды консоли set внутри AHK, хранящейся в переменной. Я уже давно это сделал, и это еще более усугубляет меня, почему он сейчас не работает.
На форумах AHK есть old thread около CMDret, функциональность на основе DLL, чтобы делать именно то, что я хочу. Первая проблема заключалась в том, чтобы найти для нее рабочую загрузку, поскольку все ссылки в сообщении были мертвы. Google дал мне another site, хостинг v3.1.2. Altough кажется, есть более новый (v3.2.1 соответственно 4d Beta), я проверил его и апробирован простой пример:Capture CMD output with AutoHotkey

msgbox % CMDret(COMSPEC " /C set") 
CMDret(CMD) 
{ 
    VarSetCapacity(StrOut, 10000) 
    RetVal := DllCall("cmdret.dll\RunReturn", "str", CMD, "str", StrOut) 
    Return, %StrOut% 
} 

К сожалению, MsgBox не было ничего. Затем я проверил RetVal, который имел значение ; и прилагаемый readme говорит:

Если функция не работает, возвращаемое значение равно нулю.

Далее вниз, он говорит:

Примечание: только 32 бит консольных приложений будут в настоящее время работают с эту DLL версию CMDret (v3.1.2 или ниже). Вызовы, которые требуют command.com, скорее всего, не приведут к выходу и могут привести к сбою. Чтобы избежать , я включил файл с именем «cmdstub.exe» с загрузкой (в папке Win9x). Этот файл следует использовать при вызове 16 бит консольных приложений для включения возвращаемого вывода.

В заключение я не уверен, в чем проблема. Моя машина работает на 64 бит. Но есть ли соответствующее предложение в readme, которое должно исключать только 16-битные системы или же оно включает только 32 бит?
Если вычислительная архитектура, вероятно, не проблема, то что может быть?

То, что я ищу, либо один из следующих действий:

  1. Могу ли я решить эту проблему и продолжать использовать v3.1.2?
  2. У кого-нибудь есть рабочий источник (или даже локальная копия) более новой версии, которую я мог проверить?
  3. Есть ли другой подход [библиотека, код .ahk и т. Д.] Я мог бы использовать для своей цели? (Предпочтительно подобное, потому что CMDret кажется очень простой)
+0

Эй! ;) вы все еще нуждаетесь в ответе? Я просто просматривал, и я нашел этот вопрос, это можно сделать полностью на ahk, я отправлю ответ, когда смогу ... Я в настоящее время путешествую ... –

ответ

0

Я нашел сценарий, единственное решение, которое работает для AutoHotkey L 64bit на: http://www.autohotkey.com/board/topic/67687-ahkahk-lusing-wsh-to-interact-with-command-line-progs/

Поиграв с ним немного, я был в состоянии capthre весь вывод 40k текстового файла, который я перечислил с помощью команды DOS Type. Существует демонстрация, показывающая, как вы можете взаимодействовать с командой времени, что приятно, если вам нужно ограничить двустороннее взаимодействие с командой dos или пакетным скриптом.

+0

I В то же время обнаружил, что он тоже. К сожалению, он всегда создает окно, и я хочу этого избежать, тем более, что я вызываю утилит с конфиденциальными данными, такими как пароли. – MCL

1

Если вы не нуждаетесь в живом выходе, вы можете использовать сам блок cmd для сохранения текстового файла, а затем вы можете обнаружить autohotkey, когда закончите PID консоли (используя возвращаемый результат runwait и прочитайте , выводимый файл в память

Таким образом, вы можете сделать это в вашей команде запуска (только регулярный параметр CMD):..

ipconfig > myoutput.txt 
exit 

Теперь у вас есть текстовый файл с выводом IpConfig в нем

ИЛИ вы могли бы сделать то же самое, но вместо вывода в текстовый файл, вы можете вывода в буфер обмена, как это:

ipconfig | clip 

Тогда, так как выход в буфер обмена, вы можете легко захватить его в AutoHotkey.

+0

Здесь я вижу проблему безопасности. Поскольку я обрабатываю конфиденциальные данные, я не хочу, чтобы мои пароли отображались в файле или в буфере обмена. Кроме того, мне нужна возможность захвата потока в реальном времени. Я думаю, используя эти методы, это было бы довольно сложно. – MCL

+0

Ну, конечно, вам придется иметь дело с этим в сценарии. Если он чувствителен, вы не можете использовать буфер обмена, потому что что-то еще может его отслеживать. Однако, если вы выходите в текстовый файл и загружаете файл в память, вы можете стереть текстовый файл и удалить его. Я делаю это в некоторых своих приложениях, и это работает как шарм. Для этого требуется всего три или четыре строки кода автозапуска. – bgmCoder

+0

Файлы также могут быть доступны любым другим способом.Конечно, файл не существует очень долго, и, может быть, я немного параноик, но есть еще шанс, который я не хочу принимать. Тем более, что AHK удаляет только файлы, которые не делают данные нечитаемыми. – MCL

1

Это прослушивание меня уже некоторое время - и, наконец, это работает!

Единственным обязательным условием для этого является MS sqlcmd.exe, база данных AHK_Dev и, конечно же, AHK_DBA, чтобы прочитать значение, когда вы хотите его использовать.

PS. убедитесь, что вы заменили {yourDir} и {yourServer} своими собственными значениями!

USE AHK_DEV 
CREATE TABLE [dbo].[AHK_DOS]([dos_out] [varchar](max) NULL) ON [PRIMARY]; 
insert into ahk_dos select 'empty' 

Создать последующий сценарий ... называют его dos_out.bat

@echo off 
if "%1" == "" ( 
    set v_cmd="" 
) else (
    set v_cmd=%1 
) 
set v_cmd=%v_cmd:~1,-1% 
SETLOCAL ENABLEDELAYEDEXPANSION 
if "!v_cmd!" == "" (
    set v_cmd="echo ... %COMPUTERNAME% %USERNAME% %DATE% %TIME%" 
    set v_cmd=!v_cmd:~1,-1! 
) 
set v_data="" 
FOR /F "usebackq delims=¬" %%i in (`!v_cmd!`) do (
    set v_data="!v_data:~1,-1!%%i~" 
) 
set q_cmd="set nocount on;update ahk_dos set dos_out=N'!v_data:~1,-1!'" 
"{yourDir}\Microsoft SQL Server\90\Tools\Binn\sqlcmd.exe" -S {yourServer} -E -d ahk_dev -Q !q_cmd! -W 
set q_cmd="set nocount on;select len(dos_out) as out_len, dos_out from ahk_dos" 
"{yourDir}\Microsoft SQL Server\90\Tools\Binn\sqlcmd.exe" -S {yourServer} -E -d ahk_dev -Q !q_cmd! -W -w 8000 
pause 

вы можете запустить его с помощью АХК ...

dosCmd2db(c) { 
runwait, {yourDir\}dos_out.bat "%c%", , , dospid 
msgbox %dospid% closed 
} 
dosCmd2db("") 
dosCmd2db("echo This is a test") 
dosCmd2db("dir") 

В том же поле обновляется каждый раз вам явно нужно что-то делать между каждым, чтобы этот пример был полезен!

Попробуйте, и дайте мне знать, как вы получите на

С уважением, Джефф

+0

Ух! Насколько я понимаю, это создаст и напишет/прочитает из локальной базы данных? Это звучит ужасно обширно. Кроме того, одним из моих требований является то, что никакие данные не доступны для других процессов, поскольку я хочу передавать пароли в качестве параметров. Я не хочу, чтобы они отображались в базе данных. – MCL