배치 스크립트의 비 모달 알림 상자
-
09-09-2019 - |
문제
Batch 파일 양식이라는 비 모달 경고 상자를 갖고 싶습니다. 현재 VBScript를 사용하여 모달 알림 상자를 만듭니다.
>usermessage.vbs ECHO WScript.Echo^( "Generating report - this may take a moment." ^)
WSCRIPT.EXE usermessage.vbs
그러나 사용자 상호 작용을 기다리지 않고 스크립트 (보고서 생성)를 진행하고 싶습니다. 이것을 어떻게 달성 할 수 있습니까? vbscript인지 아닌지는 상관하지 않습니다 - 나는 단지 내 배치 스크립트 (Windows XP)에서 작동하기를 원합니다.
해결책
현재 트릭에 대한 새로운 요구 사항이없는 간단한 답변은 start
명령 배치 파일 실행에서 스크립트를 분리하려면
그것은 다음과 같은 것처럼 보일 수 있습니다.
>usermessage.vbs ECHO WScript.Echo^( "Generating report - this may take a moment." ^) start WSCRIPT.EXE usermessage.vbs echo This text is a proxy for the hard work of writing the report
유일한 차이점이 사용되는 곳 start
실행하려면 wscript
. 이것은 현재 디렉토리에 임시 파일을 놓고 상자를 수동으로 해산해야한다는 결함으로 어려움을 겪습니다.
두 문제 모두 처리하기 쉽습니다.
@echo off setlocal set msg="%TMP%\tempmsg.vbs" ECHO WScript.Echo^( "Generating report - this may take a moment." ^) >%msg% start WSCRIPT.EXE /I /T:15 %msg% echo This text is a proxy for the hard work of writing the report ping -n 5 127.0.0.1 >NULL del %msg% >NUL 2>&1
여기서 나는 임시 스크립트를 %TMP%
폴더를 작성하고 완료되면 삭제해야합니다. 나는 an을 사용했다 echo
그리고 a ping
긴 프로세스가 실행되는 것을 보여주기 위해 시간을 낭비하도록 명령하십시오. 그리고 나는 그것을 사용했다 /I
그리고 /T
옵션 wscript
스크립트가 "대화식으로"실행되는지 확인하고 스크립트를 실행할 수 있도록 최대 시간을 설정합니다.
그만큼 @echo off
그리고 setlocal
명령 프롬프트에서 실행할 때 더 깨끗하게 보이게하고 프롬프트 환경에서`% msg%라는 이름을 남기지 못하게하십시오.
편집하다: 요하네스 로스 셀의 비판 setlocal
주석에서 잘못되었습니다. 이것이 명령 프롬프트에서 호출되면 setlocal
변수 MSG는 프롬프트 및 해당 프롬프트에서 시작된 다른 배치 파일 및 프로그램으로 보입니다. 사용하는 것이 좋습니다 setlocal
실제로 던지기 스크립트 이상의 것을 작성하는 경우 배치 파일에서 로컬 변수를 분리합니다.
이것은 쉽게 입증 될 수 있습니다.
C:> type seta.bat @set A=SomeValue C:> set A ALLUSERSPROFILE=C:\Documents and Settings\All Users APPDATA=C:\Documents and Settings\Ross\Application Data C:> seta.bat C:> set A A=SomeValue ALLUSERSPROFILE=C:\Documents and Settings\All Users APPDATA=C:\Documents and Settings\Ross\Application Data C:>