프로그램이 실행중인 CMD 창에 키 입력을 Windows 메시지로 보내 프로그램 방식으로 명령을 입력 해보십시오.
VBS를 모르지만 시스템 API 기능 PostMessage
및/또는 SendMessage
에 매핑되는 기능 또는 기능이있을 수 있습니다. 만약 누군가가 그들을 사용하는 방법을 설명하는 답변을 올렸다면 특히 좋을 것입니다. 그동안 유틸리티SendMessage이라는 도움말을 사용하여 배치 파일에서이 방법을 사용하는 방법을 설명 할 수 있습니다.
SendMessage.exe target_specification /message:value /wparam:value /lparam:value
나는 target_specification
조금 나중에 비트 주소됩니다, 다른 매개 변수는 다음과 같습니다
기본적으로,이 유틸리티는이 같은 임의의 창으로 임의의 Windows 메시지를 보낼 수 있습니다 :
/message:value
- 메시지가 code
에 의해 지정, 전송되는. 이 경우 다음 중 하나 일 수 있습니다.
/message:WM_CHAR
/message:258
/message:0x0102
모두 WM_CHAR message을 지정합니다.
/wparam:value
- WM_CHAR 메시지의 경우이 키 스트로크는 전송되는 코드이어야합니다.
귀하의 경우 귀하의 명령은 ASCII 문자로만 구성되기 때문에 모든 코드는 해당 문자의 ASCII 코드와 일치합니다. 따라서 ASCII chart을 사용하여 명령의 문자를 변환 할 수 있습니다. s
, 예를 들어
/wparam:115
및 h
/wparam:104
등이 될 것입니다.
또한 키 입력을 보내야합니다. ASCII control code chart에 따르면,
/wparam:13
/lparam:value
될 것이다 - 당신이 LPARAM 매개 변수가 실제로 단일 숫자 값으로 여러 정보를 전달하기 위해 예상되는 WM_CHAR's manual page에서 볼 수 있습니다. 그러나 특정 경우에 단지이 매개 변수가
대상 스펙 부분에 이제 /lparam:1
단순히 지정되어야 함을 기억하기에 충분한 것입니다. 이것은 까다로울 수 있습니다. the tool's web page의 설명에서 대상 창을 지정하는 다른 방법이 있음을 알 수 있습니다. 모든 방법이 당신을 위해 작동 할 수있는 것은 아닙니다.
예를 들어, 프로세스 이름으로 대상을 지정 시도 할 수 : 대신 직접 프로그램을 실행하지 않는 경우,
/processname:name_of_your_executable
그러나 및 예를 들어, 그것을 요구하고있다 배치 파일이면 프로그램은 자체 창에서 실행되지 않고 호스팅 CMD 세션의 창을 차용하므로이 방법이 작동하지 않을 수 있습니다.
그 프로그램을 호출하는 방법을 참으로 경우에, 당신은 목표 지정 창 제목을 사용하여 시도해 볼 수도 있습니다 : 제목이 고유하게 식별해야합니다 것을 여기 염두에두고
/windowtitle:window_title
유일한주의를 또는 지정된 제목과 일치하는 모든 창으로 키 스트로크가 전송됩니다. 프로그램을 호출하는 배치에서 title
명령을 사용하여 제목을 고유하게 만들 수 있습니다 (프로그램을 호출하기 전에 설정).
:
그래서, 여기에 대상 창 제목에 의해 지정됩니다 예제의 목적을 위해, 가정, 전체 백업 스크립트 (배치 스크립트)처럼 보일 수 있습니다 방법은 그것을 요약하기
@ECHO OFF
:: s
SendMessage.exe /windowtitle:"My Title" /message:WM_CHAR /wparam:115 /lparam:1
:: h
SendMessage.exe /windowtitle:"My Title" /message:WM_CHAR /wparam:104 /lparam:1
:: u
SendMessage.exe /windowtitle:"My Title" /message:WM_CHAR /wparam:117 /lparam:1
:: t
SendMessage.exe /windowtitle:"My Title" /message:WM_CHAR /wparam:116 /lparam:1
:: d
SendMessage.exe /windowtitle:"My Title" /message:WM_CHAR /wparam:100 /lparam:1
:: o
SendMessage.exe /windowtitle:"My Title" /message:WM_CHAR /wparam:111 /lparam:1
:: w
SendMessage.exe /windowtitle:"My Title" /message:WM_CHAR /wparam:119 /lparam:1
:: n
SendMessage.exe /windowtitle:"My Title" /message:WM_CHAR /wparam:110 /lparam:1
:: ENTER
SendMessage.exe /windowtitle:"My Title" /message:WM_CHAR /wparam:13 /lparam:1
:: y
SendMessage.exe /windowtitle:"My Title" /message:WM_CHAR /wparam:121 /lparam:1
:: e
SendMessage.exe /windowtitle:"My Title" /message:WM_CHAR /wparam:101 /lparam:1
:: s
SendMessage.exe /windowtitle:"My Title" /message:WM_CHAR /wparam:115 /lparam:1
:: ENTER
SendMessage.exe /windowtitle:"My Title" /message:WM_CHAR /wparam:13 /lparam:1
:: wait for some time (~3 sec) till the program shuts down, if necessary
PING -n 4 localhost 1>NUL
:: proceed with the back-up
...
구글 윈도우 자동화. 첫 번째 문제는 cmd 창을 찾는 것입니다.이 프로그램을이 창에서 실행하고 있습니까? 자신을 닫기 위해 신호를 보내는 것이 훨씬 쉬울 수도 있습니다 –
백업용 파일을 준비하기 위해 "CMD에서 실행되는 프로그램"을 시작 하시겠습니까? 그게 콘솔 프로그램인가요? "종료"및 "예"를 입력하는 것 외에 다른 상호 작용이 있습니까? 이러한 질문에 대한 대답에 따라 입력을 파이핑하는 것이 효과가있을 수 있습니다. –
@AndriyM -이 문제를 조사해 주셔서 감사합니다. 불행히도 콘솔이나 파이핑에 익숙하지 않지만 CMD 창에서 실행되는 프로그램 - 데이터베이스 프로그램 모니터링, 여러 클라이언트에서 데이터를 수신하여 데이터베이스에 기록하고 클라이언트가 물었을 때 데이터를 검색합니다. 이 두 명령은이 모니터링 프로그램을 종료하는 데 필요한 유일한 명령이므로 데이터베이스를 백업하기 전에 데이터베이스가 손상되는 것을 방지합니다. 그래서 배관 방법이 여전히 해결책이라면 - 그것은 무엇이며 어떻게 사용합니까? 다시 감사합니다! – ikonerg