是否可以在没有 window.close() 的情况下使用 javascript 发送 HTAREPLY

Is it possible to send HTAREPLY with javascript without window.close()

我正在构建一个 HTA/Batch 脚本,其中包含一个界面,供用户将 htareply 发送到批处理脚本,该批处理脚本将 link 发送到服务器以在 Jenkins 上执行构建脚本。一切都很好,但我想知道我是否可以让 hta window 打开,以便用户可以 select 另一个选项(如果需要)。有什么想法吗?

我试图从 javascript 中删除 window.close() 但它没有将 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>

我希望发生的情况是,如果用户 selects 和选项并提交,hta window 保持打开状态,直到他们 select "close"。

for /F命令是这样工作的:首先执行嵌套命令,收集它的所有输出并等待它终止; 然后 开始使用收集到的行执行for 正文中的命令。出于这个原因,如果你想同时(并行)执行,你可以 而不是 使用 for /F...

您可以使用左侧为HTA 部分,右侧为Batch 部分的管道。但是,当 set /P 命令从管道读取输入时,它会出现奇怪的行为...

解决方法是使用辅助文件,HTA部分写入,Batch部分读取:

<!-- :: 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 和 Batch 部分是通过管道 | 并行启动到 运行 的;请记住,两部分之间的通信是通过 pipeFile...