2013-12-17 3 views
2

매일 수행해야하는 백업을 자동화하려고합니다. CMD에서 실행중인 프로그램이 있는데, 백업을 실행하기 전에 제대로 닫아야합니다. 종료 예는 VBScirpt를 사용하여 이미 열려있는 CMD 창에서 명령을 실행하는 방법

은 CMD 창을 닫을 수 있습니다 그 (조치를 인정), 나는 이미 박쥐 파일이 백업을 실행하기 위해 작성 : 원함을 종료해야합니다 두 명령은.

아주 간단한 것만 빼고 VBScript를 작성한 적이 없으므로 내 질문에 불만이 있으면 미안합니다.

VBScript를 사용하여 shutdown {Enter}과 yes {Enter}를 입력하고 CMD 창을 닫은 다음 CMD 프로그램을 시작하기 위해 이미 설정된 백업 배치 파일을 실행하십시오 백업 완료.

운영 체제 - Windows XP Professional

고맙습니다!

+0

구글 윈도우 자동화. 첫 번째 문제는 cmd 창을 찾는 것입니다.이 프로그램을이 창에서 실행하고 있습니까? 자신을 닫기 위해 신호를 보내는 것이 훨씬 쉬울 수도 있습니다 –

+0

백업용 파일을 준비하기 위해 "CMD에서 실행되는 프로그램"을 시작 하시겠습니까? 그게 콘솔 프로그램인가요? "종료"및 "예"를 입력하는 것 외에 다른 상호 작용이 있습니까? 이러한 질문에 대한 대답에 따라 입력을 파이핑하는 것이 효과가있을 수 있습니다. –

+0

@AndriyM -이 문제를 조사해 주셔서 감사합니다. 불행히도 콘솔이나 파이핑에 익숙하지 않지만 CMD 창에서 실행되는 프로그램 - 데이터베이스 프로그램 모니터링, 여러 클라이언트에서 데이터를 수신하여 데이터베이스에 기록하고 클라이언트가 물었을 때 데이터를 검색합니다. 이 두 명령은이 모니터링 프로그램을 종료하는 데 필요한 유일한 명령이므로 데이터베이스를 백업하기 전에 데이터베이스가 손상되는 것을 방지합니다. 그래서 배관 방법이 여전히 해결책이라면 - 그것은 무엇이며 어떻게 사용합니까? 다시 감사합니다! – ikonerg

답변

2

프로그램이 실행중인 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 
... 
+0

와우. 고마워요! 이 일을 끝내기에 나는 이제 아주 가깝다는 것을 알 수 있습니다! 당신이 위에서 말한 모든 것을 다했는데, WM_CHAR에 대해 많은 것을 배웠습니다. 자, 내가 사용할 때 어떤 이유로.bat 명령 SendMessage.exe/windowtitle : "내 제목"/ 메시지 : WM_CHAR/wparam : 115/lparam : 1, 창에 문자를 전혀 입력하지 않습니다. 그러나 SendMessage.exe/windowtitle : "My Title"/ message : 16을 입력하면 강제로 창을 닫으라는 경고 메시지가 나타납니다. – ikonerg

+0

그 결과 윈도우의 위치가 문제가되지 않는다는 결론을 얻었습니다. WM_CHAR 명령을 사용할 때 문제가있는 것처럼 보입니다. Microsoft 웹 사이트의 WM_CHAR을보고 나서 UTF-16 문자 인코딩을 사용하여 무언가를 읽었으므로 문자를 나타 내기 위해 다른 숫자를 사용해야한다고 생각하게 되었습니까? – ikonerg

+0

죄송합니다. 어젯밤에 귀하의 답변을 볼 기회가 없었습니다. 이 점에서 여기에 말할 것도별로 없습니다. Windows 7 x64에서 테스트를 마쳤습니다. "깨끗한"'cmd.exe' 세션에서'SendMessage'를 시도했습니다 (즉,'cmd.exe'를 실행하고, 제목을 설정 한 다음 WM_CHARs를 보냈습니다). 그리고 CMD 세션에서'ftp.exe'를 사용하여 'cmd.exe', 같은 창 안에서 자체 세션을 시작한'ftp.exe'라는 제목을 설정 한 다음 WM_CHARs를 보냈습니다). 두 가지 테스트 모두 성공했습니다. 모르겠다. 아마도 DOS (* 실제 * DOS) 프로그램을 사용하고 있으며 WM_CHAR을받을 수 없다. 내 승 7에서 확인할 수는 없지만 두려워합니다. –

관련 문제