2016-10-04 3 views
2

HTA 파일 내에서 배치 파일을 시작하려고합니다. 배치 파일의 시작은 적절하게 (또는 적어도 연관된 CMD 프롬프트로) 시작되지만, 배치는 약 5 분이 걸릴 때 나중에 닫힙니다. 잠시 CMD 프로세스가 실행되는 동안 HTA 창이 일시 중지 된 것으로 나타나고 CMD 프로세스가 끝나면 즉시 닫힙니다. HTA에 대한 다른 모든 것들이 적절하게 기능합니다.HTA 내에서 배치 파일 시작

목표는 HTA가 배치 파일을 백그라운드 (숨김)로 시작하고 배치 파일이 처리되는 동안 HTA에 아무런 영향을 미치지 않게하는 것입니다. 배치 파일이 완료되고 종료되면 HTA는 사용자에 대한 정보가 포함 된 새 HTA를 시작합니다.

여기

<html> 
    <head> 
    <style> 
     body { background:#fff url('../_dependencies/welcome.jpg') no-repeat center center fixed; color:#000; margin:25px; padding:0; } 
     div#gap { height:306px; } 
     div#buttons { padding-right:12px; position:absolute; right:0; } 
    </style> 
    <title>Installer</title> 
    <script language="vbscript"> 
     Sub Window_OnLoad 
     Set Shell = CreateObject("WScript.Shell") 
     Set objFSO = CreateObject("Scripting.FileSystemObject") 
     sPath = Shell.ExpandEnvironmentStrings("%curdir%") 
     Continue = Chr(34) & sPath & "_install.cmd" & Chr(34) 
     Shell.Run Continue,0,True 
     CompName = Shell.ExpandEnvironmentStrings("%computername%") 
     Const ForAppending = 8 
     textFile = sPath & "_Logs\" & CompName & ".upgraded.txt" 
     If Not objFSO.FileExists(textFile) Then 
      Set objTextFile = objFSO.CreateTextFile(textFile, True) 
      objTextFile.Close 
     End If 
     Set objTextFile = objFSO.opentextfile(textFile,ForAppending) 
     objTextFile.WriteLine("Upgrade complete on this computer." & vbCrLf & Now()) 
     objTextFile.Close 
     Set textFile = Nothing 
     self.close() 
     End Sub 
    </script> 
    <script language="javascript"> 
     window.resizeTo(620,365); 
     window.moveTo((screen.width-620)/2,(screen.height-365)/2); 
    </script> 
    <hta:application applicationname="Installer" border="none" caption="no" id="objnotitlebar" innerborder="no" maximizebutton="no" minimizebutton="no" scroll="no" showintaskbar="no" singleinstance="yes" systemmenu="no"> 
    </head> 
    <body> 
    <div id="gap"><img src="../_dependencies/waiting.gif" /></div> 
    <div id="buttons"></div> 
    </body> 
</html> 
+0

'install.cmd' 소스 코드도 게시해야합니다 – Hackoo

답변

0

Windows가 %curdir% 변수 환경을 제공하지 않습니다 ... 나는 그가 제대로 작동하지 않고있는 HTA입니다. 확장하면 리터럴 문자열 %curdir%이 생성되므로 %curdir%_install.cmd 파일을 찾을 수 없기 때문에 명령 프롬프트가 즉시 종료됩니다. 아마도 %cd%을 의미 했습니까? 이 변수는 CMD에서만 사용할 수 있습니다.

그리고 처음에 현재 작업 디렉토리에서 스크립트를 실제로 실행 하시겠습니까? HTA와 동일한 디렉토리에서 배치 파일을 실행한다는 의미 일 가능성이 큽니다. 그 위치는 다음과 같이 구할 수있다 : 즉,이에 선

Shell.Run Continue,0,True 

를 변경 도움이되지 않는 경우

dir = objFSO.GetParentFolderName(Replace(document.location.href, "file:///", "")) 
sPath = objFSO.GetFolder(dir).Path 

은 : cmd /k와 배치 스크립트를 실행

Shell.Run "%COMSPEC% /k " & Continue, 1, True 

명령을 유지 스크립트 실행 후 (확인 된) 프롬프트가 열리므로 오류가 있는지 확인할 수 있습니다.

+0

% curdir % 변수는 % ~ dp0 값으로 미리 채워져 있습니다. 그 변수를 msgbox로하면 올바르게 표시됩니다. 배치 파일의 경우 HTA 파일이있는 디렉토리의 한 디렉토리에 있습니다. 제안에 관해서는 Shell.Run 명령을 변경 했으므로 이제 CMD 창을 열어 볼 수 있지만 단순히 프롬프트에 앉아 배치 파일과 HTA에서 재생해야하는 애니메이션을 실행하지 않습니다 화면은 CMD 프롬프트가 열려있는 동안 일시 중지됩니다. – user3208239

+0

'@echo hello'라는 줄만있는 배치 파일에서도 동일한 효과를 얻습니까? –

+0

아니요. 멈춤이 뒤 따르는 간단한 hello와 함께 간단한 배치 파일은 훌륭하고 멋쟁이를 보여준다. 그것은 원래 배치 파일 내에서 다른 배치 파일을 호출하기 때문에 그것이 있는지 궁금해? 알아 내기 위해 더 많은 테스트를 수행 할 것입니다. 고맙습니다. – user3208239

0

그래서 약간의 문제 해결 후에 배치 스크립트의 문제는 시작 문이 잘못 구성되어 있습니다.

@start /b /min /wait "upgradeinstaller.exe" /silent /noreboot 

나는이에 변경이 :

내가 분명히 시작 명령에 제목을 추가하는 데 필요한
@start /b /min /wait "Upgrade Installer" "upgradeinstaller.exe" /silent /noreboot 

, 그렇지 않으면 시작 명령이 처음 인용 된 생각

시작 문이 있었다 텍스트가 제목 인 경우 스위치가 시작에 적용되었지만 작동하지 않습니다.