我正在构建一个 HTA/批处理脚本,其中包含一个接口(interface),供用户向批处理脚本发送 htareply,该批处理脚本将发送一个链接到服务器以在 Jenkins 上执行构建脚本。一切都很好,但我想知道是否可以将 hta 窗口保持打开状态,以便用户可以根据需要选择另一个选项。有什么想法吗?
我尝试从 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>
我希望发生的是,如果用户选择选项并提交,hta 窗口将保持打开状态,直到他们选择“关闭”。
最佳答案
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 部分通过管道 |
启动,只是为了并行运行两者;请记住,两个部分之间的通信是通过管道文件执行的...
关于javascript - 是否可以使用 javascript 发送 HTAEPLY 而无需 window.close(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56650624/