从 hta 批处理文件运行 CMD 命令?

Posted

技术标签:

【中文标题】从 hta 批处理文件运行 CMD 命令?【英文标题】:Run CMD command from hta batch file? 【发布时间】:2022-01-05 06:15:12 【问题描述】:

我有一个 hta 脚本(批处理文件),它显示了几个按钮,当我单击这些按钮时,我希望在我的 cmd 中执行一个命令。例如,当我按下“IP地址”按钮时,应该在cmd中输入命令“ipconfig”并执行。我能做些什么?或者这是可能的,还是有其他选项可以通过这个 hta 脚本执行命令?

亲切的问候, jcjms

这是我的代码:

<!-- :: 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="black">
<TITLE>HTA Buttons</TITLE>
<SCRIPT language="javascript">
window.resizeTo(374,400);


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();


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



</SCRIPT>
</HEAD>
<BODY>
   Aruments:<textarea name="args" style="display:none; cols="40" rows="1"></textarea>
   <h1 style="color:white;font-size:40px;">Commands</h1>   
   <hr>
   <button style="background-color:black; border-color:white; color:white" onclick='[what to do here? I want to shutdown other PCs in my local network over the window that opens in cmd (shutdown /iCODELOCK)]'>PC shutdown</button>
   <button style="background-color:black; border-color:white; color:white" onclick='[what to do here? I want to get the PCs IP in cmd (ipconfig)]'>IP-Adress</button>
   <button style="background-color:black; border-color:white; color:white" onclick="closeHTA(1);">close</button>
</BODY>
</HTML>

【问题讨论】:

检查this 答案,我认为它适用于您的情况。 听起来不错,但我不能在一台 PC/目录上拥有所有批处理文件(不要问为什么 XD)。所以我必须直接从 hta 脚本执行命令。 您的head 中不能有一个body 元素,该元素对于HTML 和扩展的HTA 文档来说不是有效的结构。 我建议你在dostips.com阅读这个帖子 是的,也许你是对的,对不起,我是个菜鸟 【参考方案1】:

简而言之,你需要:

onclick="callShellApplication('ipconfig')"

一个工作示例可能如下所示:

<html>
<head>
    <HTA:APPLICATION SCROLL="yes" SYSMENU="no" />
    <title>HTA Buttons</title>
    <script language="JScript">
    //window.resizeTo(374,400);

    function callShellApplication(command)
        var shell = new ActiveXObject("WScript.Shell"),
        exec = shell.Exec(command);
        output.innerHTML = exec.StdOut.ReadAll().replace(/\r\n/g, '<br>');
    
    </script>
    <style>
        *color:white
        buttonbackground-color:black; border-color:white
    </style>
</head>
<body bgcolor="black">
    <h1 style="font-size:40px;">Commands</h1>   
    <hr>
    <button onclick="callShellApplication('shutdown /s')">PC shutdown</button>
    <button onclick="callShellApplication('ipconfig')">IP-Adress</button>
    <button onclick="window.close()">close</button>
    <hr>
    <pre id="output"></pre>
</body>
</html>

【讨论】:

你知道,我如何在同一个 cmd 窗口中单击 1 个按钮运行 2 个命令?因为在我的 CMD 中有类似 CMD“锁”的东西,它在第一个命令之前放置了一个神秘的符号,所以如果我在同一个 CMD 窗口中执行两个命令,它只会运行第二个。所以我想做执行2。我该怎么做?亲切的问候,jcjms。 @jcjms 这个应该可以工作:onclick="callShellApplication('cmd /C &amp;quot;ipconfig &amp;&amp; TASKLIST&amp;quot;')"【参考方案2】:

当心那些方法应该贬低它是一个安全性宽松的 html 布局文件,因此你必须小心你如何制作你的 cmd、javascript、vb 脚本或 PowerShell 命令。

混合格式中最简单的方法是使用vb方法生成和运行按钮混合匹配没有问题

使用像这样更简单的主体结构,但确保您的 JavaScript 可以传递参数

<HTML>
  <HEAD>
    <TITLE>HTA Example</TITLE>
  </HEAD>
  <BODY>
    <FORM>
      <INPUT TYPE="Run" NAME="Button" VALUE="Click Me">

      <SCRIPT FOR="Button" EVENT="onClick" LANGUAGE="VBScript">
        Set WshShell = CreateObject("WScript.Shell")
        WshShell.Run "cmd.exe /k echo off & echo/ & echo this could run IPconfig &IPconfig /? |more +38"
      </SCRIPT>

    </FORM>
  </BODY>
</HTML>

有关安全性和 SVG 图形等增强功能的更多信息,您需要查看 https://docs.microsoft.com/en-us/previous-versions/ms536496(v=vs.85)

您切换问题添加了应该在 OP 中的代码,所以我仍然建议最简单的方法是将您的调用调整为简单的 vbscript

在您的脑海中添加以进行测试

      <SCRIPT FOR="shutdown" EVENT="onClick" LANGUAGE="VBScript">
        Set WshShell = CreateObject("WScript.Shell")
        WshShell.Run "cmd.exe /k echo change /k to /c and remove this comment including echo's SHUTDOWN /iCODELOCK"
      </SCRIPT>

      <SCRIPT FOR="ipconfig" EVENT="onClick" LANGUAGE="VBScript">
        Set WshShell = CreateObject("WScript.Shell")
        WshShell.Run "cmd.exe /k IPconfig"
      </SCRIPT>

将按钮更改为

   <button style="background-color:black; border-color:white; color:white" name="shutdown">PC shutdown</button>
   <button style="background-color:black; border-color:white; color:white" name="ipconfig">IP-Adress</button>
   <button style="background-color:black; border-color:white; color:white" onclick="closeHTA(1);">close</button>

【讨论】:

以上是关于从 hta 批处理文件运行 CMD 命令?的主要内容,如果未能解决你的问题,请参考以下文章

从代码执行 CMD 命令

cmd下执行bat文件的命令

有人可以告诉我如何从 Notepad++ 运行批处理文件吗

HTA - 处理命令行输入参数

使用cmd.exe以UTF-8编码保存文本文件

bat批处理文件运行时隐藏cmd窗口