Можно ли отправить HTAREPLY с Javascript без window.close () - PullRequest
2 голосов
/ 18 июня 2019

Я создаю сценарий HTA / Batch, который включает в себя интерфейс для пользователя, чтобы отправить htareply в пакетный сценарий, который отправит ссылку на сервер для выполнения сценария сборки в Jenkins. Все отлично работает, но мне было интересно, могу ли я оставить окно hta открытым, чтобы пользователь мог выбрать другой вариант, если это необходимо. Есть идеи?

Я попытался удалить window.close() из javascript, но затем он не отправляет htareply в пакетный скрипт.

<!-- :: Batch section
@echo off
setlocal

echo Select an option:
for /F "delims=" %%a in ('mshta.exe "%~F0"') do set "HTAreply=%%a"
echo End of HTA window, reply: "%HTAreply%"
PAUSE
goto :EOF

-->


<HTML>
<HEAD>
<HTA:APPLICATION SCROLL="no" SYSMENU="no" >

<TITLE>HTA Radio Buttons</TITLE>
<SCRIPT language="JavaScript">
window.resizeTo(440,170);

var reply = "No button selected";
function sendreply(){
  var fso = new ActiveXObject("Scripting.FileSystemObject");
  fso.GetStandardStream(1).WriteLine(reply);
  //window.close();
}

</SCRIPT>
</HEAD>
<BODY>
<p>Select an option.</p>
<label><input type="radio" name="option1" onclick="reply=this.value" 
value="option1">Option1</label>
<label><input type="radio" name="option2" onclick="reply=this.value" 
value="option2">Option2</label>
<label><input type="radio" name="option3" onclick="reply=this.value" 
value="option3">Option3</label>
<br><br>
<button onclick="sendreply()">Submit</button>
<button onclick="window.close()">Close</button>
</BODY>
</HTML>

Я хотел бы, чтобы, если пользователь выбирает опцию и отправляет ее, окно hta остается открытым, пока он не выберет «закрыть».

1 Ответ

2 голосов
/ 18 июня 2019

Команда for /F работает следующим образом: first выполните вложенную команду, соберите все ее выходные данные и дождитесь ее завершения; затем начинают выполнять команды в теле for со собранными строками. По этой причине вы можете не использовать for /F, если хотите одновременного (параллельного) выполнения ...

Вы можете использовать трубу с деталью HTA с левой стороны и деталью партии с правой стороны. Однако когда команда set /P читает входные данные из канала, это вызывает странное поведение ...

Решение состоит в том, чтобы использовать вспомогательный файл, поэтому часть HTA записывает в него, а часть пакета читает из него:

<!-- :: Batch section
@echo off
setlocal

rem Initialize Batch side interface the first time
if "%~1" equ "interface" goto :interface

rem Empty pipe file
cd . > pipeFile.txt

echo Select an option:

rem Start HTA-Batch interface
mshta.exe "%~F0" >> pipeFile.txt  |  "%~F0" interface < pipeFile.txt
PAUSE
del pipeFile.txt
goto :EOF


:interface

set "HTAreply="
set /P "HTAreply="
if "%HTAreply%" equ "" goto interface

echo Reply: "%HTAreply%"
if "%HTAreply%" neq "EOF" goto interface
echo End of HTA window

goto :EOF

-->


<HTML>
<HEAD>
<HTA:APPLICATION SCROLL="no" SYSMENU="no" >

<TITLE>HTA Radio Buttons</TITLE>
<SCRIPT language="JavaScript">
window.resizeTo(440,170);

var reply = "No button selected";
var fso = new ActiveXObject("Scripting.FileSystemObject");
function sendreply(){
  fso.GetStandardStream(1).WriteLine(reply);
  //window.close();
}

</SCRIPT>
</HEAD>
<BODY>
<p>Select an option.</p>
<label><input type="radio" name="option1" onclick="reply=this.value" 
value="option1">Option1</label>
<label><input type="radio" name="option2" onclick="reply=this.value" 
value="option2">Option2</label>
<label><input type="radio" name="option3" onclick="reply=this.value" 
value="option3">Option3</label>
<br><br>
<button onclick="sendreply()">Submit</button>
<button onclick="fso.GetStandardStream(1).WriteLine('EOF'); window.close()">Close</button>
</BODY>
</HTML>

В этом решении части HTA и партии запускаются по конвейеру |, чтобы просто работать параллельно; помните, что связь между двумя частями осуществляется через pipeFile ...

...