batch-file - 用于运行批处理文件的 GUI

标签 batch-file cmd

我有 3 个批处理文件。其中之一需要用户输入。我想知道如何才能拥有一个带有 3 个按钮(每个批处理文件 1 个)和一个用于用户输入的文本框(将由其中一个批处理文件使用)的 GUI?

我正在尝试使用 this answer使其如下图所示:

<!-- :: 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%"
goto :EOF
-->


<HTML>
<HEAD>
<HTA:APPLICATION SCROLL="no" SYSMENU="no" >
<body bgcolor="cyan">
<TITLE>HTA Buttons</TITLE>
<SCRIPT language="JavaScript">
window.resizeTo(374,100);

function closeHTA(reply){
   var fso = new ActiveXObject("Scripting.FileSystemObject");
   fso.GetStandardStream(1).WriteLine(reply);
   window.close();
}

</SCRIPT>
</HEAD>
<BODY>
   <button onclick="call C:\Users\user1\Documents\bat1.bat";closeHTA(1);>Bat1</button>
   <button onclick="call C:\Users\user1\Documents\bat2.bat;closeHTA(2);">Bat2</button>
   <button onclick="call C:\Users\user1\Documents\bat3.bat;closeHTA(3);">Bat3</button>
</BODY>
</HTML>

我面临几个问题:

  1. 我在 <button onclick="call C:\Users\user1\Documents\bat1.bat";closeHTA(1);>Bat1</button> 行中收到错误说需要分号,如下所示,我不确定这是否是在这部分中调用批处理文件的正确方法? enter image description here
  2. 如何拥有一个文本框,以便我可以输入参数并将其传递到其中一个批处理文件?
  3. GUI 和 cmd 未锚定,因此如果我关闭 cmd,按钮的 GUI 仍然存在并且不会关闭,如下所示: enter image description here

最佳答案

尝试这样:

<!-- :: 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%"
goto :EOF
-->


<HTML>
<HEAD>
<HTA:APPLICATION SCROLL="no" SYSMENU="no" >
<body bgcolor="cyan">
<TITLE>HTA Buttons</TITLE>
<SCRIPT language="JavaScript">
window.resizeTo(374,100);

function closeHTA(reply){
   var fso = new ActiveXObject("Scripting.FileSystemObject");
   fso.GetStandardStream(1).WriteLine(reply);
   window.close();
}

function callShellApplication(command){
    var r = new ActiveXObject("WScript.Shell");
    var res=r.Exec(command);     
    new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(res.StdOut.ReadLine());   
    window.close();
}



</SCRIPT>
</HEAD>
<BODY>
   <button onclick='callShellApplication("C:\\test.bat")'>Bat1</button>
   <button onclick='callShellApplication("C:\\Users\\user1\\Documents\\bat2.bat")'>Bat2</button>
   <button onclick='callShellApplication("C:\\Users\\user1\\Documents\\bat2.bat")'>Bat3</button>
</BODY>
</HTML>

使用 javascript 或 html 时,您需要使用双反斜杠。您不能直接从 HTA 调用 bat,但需要使用 WScript.Shell 对象

编辑要传递参数(如评论中所要求的),您可以尝试类似的操作:

<!-- :: 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%"
goto :EOF
-->


<HTML>
<HEAD>
<HTA:APPLICATION SCROLL="no" SYSMENU="no" >
<body bgcolor="cyan">
<TITLE>HTA Buttons</TITLE>
<SCRIPT language="JavaScript">
window.resizeTo(374,300);


function sleepFor( sleepDuration ){
    var now = new Date().getTime();
    while(new Date().getTime() < now + sleepDuration){ /* do nothing */ } 
}

function callShellApplication(command){
    var args=document.getElementById('args').value;
    var r = new ActiveXObject("WScript.Shell");
    var res=r.Exec(command +" "+args);    
    var out="";
    while (res.Status == 0)
    {
         sleepFor(100);
    }
    while (!res.StdOut.AtEndOfStream){
        out=out+"\r\n"+res.StdOut.ReadLine();
    }

    var StS=new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1);
    StS.Write(out);     
    //new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(res.StdOut.ReadLine());   
    window.close();
}



</SCRIPT>
</HEAD>
<BODY>
   Aruments:<textarea name="args" cols="40" rows="1"></textarea>
   <hr>
   <button onclick='callShellApplication("C:\\test.bat")'>Bat1</button>
   <button onclick='callShellApplication("C:\\Users\\user1\\Documents\\bat2.bat")'>Bat2</button>
   <button onclick='callShellApplication("C:\\Users\\user1\\Documents\\bat2.bat")'>Bat3</button>
</BODY>
</HTML>

关于batch-file - 用于运行批处理文件的 GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49729727/

相关文章:

java - Java 8.0 的 MaxPermSize 解决方法

firefox - 如何通过 Selenium RC 在 firefox webdriver 中运行插件?

java - R/Java .jar - 设置环境变量。未找到 native JRI 库

linux - 什么是 Linux 命令 wc -l 的 windows 等价物?

windows - 如何将工作目录中文件名超过30个字符的文件的文件名写入文本文件?

batch-file - 为什么 setlocal 会干扰 Windows 批处理文件中的 chdir?

c# - 编译时从数据库获取dll版本号

go - 无法执行ffprobe命令

java - 使用脚本从 *.jar 中删除文件

batch-file - 如何使用 PuTTY 批处理文件将上次修改的文件从远程服务器下载到本地