Запуск командного файла из HTA

Я пытаюсь запустить командный файл из файла 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>

person user3208239    schedule 04.10.2016    source источник
comment
Вы также должны опубликовать исходный код install.cmd   -  person Hackoo    schedule 04.10.2016


Ответы (2)


Windows не предоставляет переменную среды %curdir%. Его раскрытие дает буквальную строку %curdir%, поэтому командная строка, вероятно, сразу же закрывается, потому что файл %curdir%_install.cmd не может быть найден. Возможно, вы имели в виду %cd%? Эта переменная доступна только в CMD.

И вы действительно хотите запустить скрипт из текущего рабочего каталога в первую очередь? Я бы сказал, что более вероятно, что вы хотите запустить командный файл из того же каталога, что и HTA. Это местоположение можно определить так:

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

Если это не поможет изменить строчку

Shell.Run Continue,0,True

в это:

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

Запуск пакетного сценария с cmd /k сохраняет командную строку открытой после (попытки) выполнения сценария, поэтому вы можете увидеть, были ли ошибки.

person Ansgar Wiechers    schedule 04.10.2016
comment
Переменная% curdir% предварительно заполняется значением% ~ dp0. Когда я сообщаю эту переменную, она отображается правильно. Что касается командного файла, он находится в одном каталоге выше, чем файл HTA. Что касается вашего предложения, я внес изменения в команду Shell.Run, и теперь я вижу, что окно CMD открыто, но оно просто сидит в приглашении и не запускает командный файл и анимацию, которая должна воспроизводиться на HTA. экран приостанавливается до тех пор, пока приглашение CMD остается открытым. - person user3208239; 04.10.2016
comment
Получаете ли вы тот же эффект с пакетным файлом, содержащим только строку @echo hello? - person Ansgar Wiechers; 04.10.2016
comment
Неа. Простой командный файл с простым эхо-приветствием, за которым следует пауза, отображается просто отлично и красиво. Интересно, связано ли это с вызовами разных командных файлов в исходных командных файлах? Я собираюсь провести еще несколько тестов, чтобы выяснить это. Спасибо. - person user3208239; 04.10.2016
comment
Тогда проблема связана с запущенным вами пакетным скриптом, а не с вашим HTA. - person Ansgar Wiechers; 04.10.2016
comment
Я тоже так думал, но если я запустил пакетный скрипт сам по себе, за пределами HTA, он будет работать без ошибок или проблем. Такое поведение встречается только тогда, когда он вызывается из HTA. Возможно, HTA просто не может обрабатывать некоторые команды в пакетном сценарии? - person user3208239; 04.10.2016
comment
Навряд ли. Однако, не видя вашего командного файла (и, желательно, того, который вы используете для запуска HTA), я больше ничего не могу вам сказать. - person Ansgar Wiechers; 04.10.2016
comment
Мне потребуется некоторое время, чтобы отредактировать командные файлы, чтобы исключить конфиденциальные данные перед их публикацией. - person user3208239; 04.10.2016
comment
Позвольте нам продолжить это обсуждение в чате. - person user3208239; 05.10.2016
comment
Теперь единственная проблема, которую необходимо решить, - это когда программа установки работает, скрытая в фоновом режиме, анимация зависает в окне HTA, если указатель мыши не наведен на нее. - person user3208239; 06.10.2016

Итак, после небольшого устранения неполадок проблема в пакетном сценарии заключалась в неверно настроенной инструкции запуска.

Заявление о начале было таким:

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

Я изменил его на это:

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

По-видимому, мне нужно было добавить заголовок к команде запуска, иначе команда запуска думала, что первый цитируемый текст был заголовком, затем были применены переключатели для запуска, что не работает.

person user3208239    schedule 05.10.2016