프로그램을 시작하고 특정 문자열을 출력 할 때까지 기다린 후 계속


3

배치 스크립트가 배치 스크립트를 실행하여 종료되지 않은 다음 배치 스크립트를 몇 개 더 실행하여 종료 한 다음 첫 번째 배치 스크립트를 닫고 싶습니다.

문제는 내가 시작한 첫 번째 배치 스크립트가 다른 스크립트를 실행하기 전에 연결을 설정해야하며 완료 시점을 결정하려면 첫 번째 스크립트의 출력을보고 연결이 있음을 나타내는 문자열에 대해 시작해야한다는 것입니다 설립.

의사 코드에서

start first script
wait for first script to output specific string
while the first script remains running:
    run several other scripts
close the first script

이 문자열은 몇 개의 이전 줄이 인쇄 된 후에 만 ​​나타납니다. 라인 수와 소요 시간은 모두 다를 수 있습니다. 문자열이 한 번에 모두 출력되지는 않습니다. 이 스크립트를 수정할 수 없습니다.

원하는 결과는 다음과 같습니다.

C:\>first_batch_script.bat
Some line
Doing a thing
Winning the points
The Sims did this joke better
Connection established
certain string
C:\>other_batch_script.bat
other_batch_script is done!
C:\>another_batch_script.bat
another_batch_script is done!
C:\>REM kill first_batch_script.bat

이것은 내가 시도하는 코드입니다.

FOR /f "tokens=* delims=" %%L IN ('first_batch_script.bat ^| find "certain string"') DO echo %%L
call other_batch_script.bat
call another_base_script.bat
REM kill first_batch_script.bat

사용하는 FOR /f것이 유망한 것처럼 보이지만이 스크립트를 실행하면 배치 스크립트가 상당히 느리게 실행 된 다음 정지하는 것처럼 보입니다. 어쨌든, 통과하더라도 루프를 벗어나 코드를 계속 실행하는 좋은 방법을 찾지 못했습니다.

START /WAIT내가 시작한 첫 번째 스크립트가 종료되지 않아야하므로 사용 하지 않아도됩니다. 모든 종류의 타이밍 방법을 사용하면 연결이 설정되는 데 상당히 다른 시간이 걸릴 수 있으므로 작동하지 않습니다.

그래서 길고 짧습니다.

배치 스크립트의 출력을 모니터링하고 특정 문자열이 표시되면 추가 스크립트 만 실행하려면 어떻게합니까?


지금까지 가지고있는 스크립트를 우리와 공유 할 수 있습니까? 그리고 당신의 질문은 정확히 무엇입니까?
CharlieRB

배치 스크립트 여야하는 특정 이유가 있습니까? 그렇지 않으면 AutoIt이라는 scrpting language / programm을 사용하여 목표를 달성 할 수 있는지 볼 수 있습니다. 필요한 경우 배치와 AutoIt을 결합 할 수도 있습니다.
Ivan Viktorovic 2016 년

@IvanViktorovic 그것을 사용하여 답변을 자유롭게주십시오.하지만이 코드를 소개하는 데 필요한 추가 종속성이 아니라 필요한 빠르고 간단한 코드 조각을 선호합니다. 그러나 그것이 가장 좋은 방법이라면, 가장 좋은 방법입니다.
KRyan

@CharlieRB 죄송합니다. 수정되었습니다.
KRyan

답변:


1

요구 사항을 올바르게 이해하면 for /f내부 프로세스가 끝날 때까지 기다릴 때 작동하지 않습니다. 이 예제와 같이 파일에서 동기화를 시도
할 수 있습니다 . (이것은 의존하는 스크립트 파일입니다 wait.bat) :

@echo off

:loop
timeout /t 1
(type res.txt |find "trip")  > nul 2>&1
if errorlevel 1 goto loop
echo I can go!

cmd 창에서 시작한 다음 두 번째 cmd (동일한 dir)를 열고 실행하십시오 (예 : 다시 한 번) :
ping localhost |find "trip" >res.txt
ping 출력 'trip'후에 만 'I can go'가 표시됩니다 (예 : 곧 종료되지만 기본 스크립트 / process는 필요하지 않습니다)

일반적으로 기본 스크립트를 먼저 시작한다는 점에 유의하십시오! 또한 동기화 파일이 비워집니다.

당신은 당신이 정확히 기다려야 할 것을 말하지 않았습니다. 아마도 그것을 점검하는 더 간단한 방법이 있습니까? (예 : netstat를 사용하여 열린 연결 확인)?


나는 그 대안을 탐색하려고 시도하는 답변에 관심이 없기 때문에 정확히 내가 정확히 무엇을 기다리고 있는지 말하지 않았습니다. 여하튼, 나의 두려움을 확인해 주셔서 감사합니다 : FOR /f; 나는 누군가가 그 해결 방법을 알기를 바랐다. 어쨌든,이 답변은 내가 실행중인 스크립트를 수정할 수 없기 때문에 도움이되지 않습니다 (스크립트가 업데이트 될 때 이러한 편집 내용이 지워지고 그러한 변경 사항을 푸시 할 권한이 없습니다). +1입니다.
KRyan

수정할 필요가 없습니다. 마스터 (내 예제에서 ping) 명령을 하나의 배치 파일에 넣고 종속 스크립트를 루프 아래의 두 번째 배치 ( 'I can go'를 넣는 위치)에 넣고 다른 두 개를 시작하는 세 번째 배치를 만듭니다 (시작과 함께)
wmz

더 쉽게 죄송합니다 : 마스터 (내 예제에서 ping) 명령을 배치 파일 하나에 넣고 start myMaster.bat맨 위에 wait.bat넣고 종속 스크립트를 루프 아래에 놓습니다 ( 'I can go'을 넣습니다)
wmz

아, 내 생각 엔 지금은 제대로 테스트 할 수 없지만 이것이 효과가 있다고 생각합니다. 확인한 후에 수락하겠습니다.
KRyan

고마워요, 완벽하게 작동합니다. 당신이 어디에 두 었는지 의미를 알아 내기 위해 그것을 얻었지만 작동합니다.
KRyan

0

잘못된 접근법을 사용하고있는 것 같습니다. 출력을 무언가로 파이프하는 데 사용할 수 있지만 프로그램으로 무언가를 파이프하는 데 사용할 수있는 연산자가 있습니다.

두 번째 방법을 사용하면 FTP.exe와 같은 명령 줄 프로그램을 제어 할 수 있으며 작성중인 내용에 따라 정확히 필요한 것 같습니다.

직접 수행해야하는 모든 키 누르기가있는 텍스트 파일을 작성하고 Enter가 필요할 때 Enter를 누르면 각 명령이 고유 한 행에 나타납니다.

예를 들면 input.txt다음과 같습니다.

MyUsername
qwertyPasswd
y
2
3
quit

위의 내용은 먼저 입력 MyUsername하고 Enter 키를 누릅니다. 그런 다음 두 번째 줄 등을 씁니다.

이제 프로그램을 시작하고 텍스트 파일을 파이프로 파이프하십시오.

C:\>ftp.exe <input.txt

.

명령 분석 :

C:\>ftp.exe 이것은 당신이 실행할 수있는 프로그램의 예입니다.

<input.txt <문자를 참고하면 input.txt의 내용을 입력하고이를 userinput으로 처리합니다.

프로그램이 키보드 입력을 기대하지 않으면 파이프는 공급을 기다립니다.


아니요, 이것은 원격으로 필요한 것이 아닙니다. 내가 발행하는 명령은 첫 번째 프로그램의 명령이 아니라 별도의 배치 스크립트입니다. 그들은 단지 첫 번째 프로그램에 의해 설정된 연결을 사용합니다.
KRyan

한 스크립트의 출력을 다른 스크립트의 입력으로 사용할 수도 있습니다. 어쩌면 여전히 작동합니다. 이렇게하려면 | 캐릭터. Program1 | 프로그램 1의 출력이 program2의 출력으로 전송되는 Program2. (또는이 경우 스크립트)
LPChip 2016 년

Windows 스크립팅에 익숙하지 않지만 첫 번째 스크립트가 별도의 인스턴스에서 여러 줄을 출력 할 때 얼마나 잘 작동합니까? 파이프로 연결된 스크립트가 즉시 가져로 실행하면 어떤 입력을, 그것은 문자열을받지 않습니다. 첫 번째 스크립트가 종료 될 때까지 기다리면 종료되지 않아야하기 때문에 발생하지 않습니다.
KRyan

나는 당신의 대본에 대한 지식이 충분하지 않기 때문에 대답 할 수 없습니다. 당신은 그것을 시도하고 무슨 일이 일어나는지 확인해야합니다.
LPChip
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.