使用HTML表单作为PowerShell的GUI

时间:2011-05-12 17:24:32

标签: html events powershell

我有一个powershell脚本,我想使用html表单运行。我只有几个表单字段和一个按钮。当我运行我的PowerShell脚本时,它会打开一个新的窗口,然后使用表单导航到正确的页面。如何在用户单击按钮后收集表单中填写的信息?

修改

以下是我正在努力工作的一些代码:

function onClick($server)
{
    $server.value="here"
}

$ie = new-object -com "Internetexplorer.Application"
$ie.navigate("bulk_upload.html")
$ie.visible = $true

$doc = $ie.document
$btn = $doc.getElementById("submit")
$server = $doc.getElementById("server")

$btn.add_onclick({onClick $server})

我运行此代码,单击按钮

后没有任何反应

更新

我尝试运行此代码:

$ie = new-object -com "Internetexplorer.Application"
$ie.navigate("bulk_upload.html")
$ie.visible = $true

$doc = $ie.document
$btn = $doc.getElementById("submit")

$eventId = Register-ObjectEvent $btn HTMLButtonElementEvents_Event_onclick -Action {write-host 'hi'}

我收到了这个错误:

无法注册活动。不支持需要返回值的事件

7 个答案:

答案 0 :(得分:3)

我试图完成同样的事情并跑过你的帖子。我看到它已经有8个月了,但如果你还在寻找我发现的东西。我无法让“onclick”工作。所以我使用了隐藏的输入字段,并为按钮定义了一个动作来更新该字段的值。在powershell中,我为隐藏字段获取了getElementbyId,并使用它来识别用户已完成输入。

$html = @"
<html>
<body>
<form>
First name: <input type="text" id="firstname">
<br>
Last name: <input type="text" id="lastname">
<br>
<input type="hidden" name="finished" value="0">
<input type="button" id="button" value="Continue" onclick="finished.value=1">
</form>
</body>
</html>
"@

$ie = new-object -com "InternetExplorer.Application"
$ie.navigate2("about:blank")
$ie.AddressBar  = $false
$ie.MenuBar     = $false
$ie.StatusBar   = $false

$ie.document.body.innerHTML = $html
$ie.Visible = $true
$doc = $ie.document

while ($doc.getElementByID("finished").value -ne 1) {
    start-sleep -m 500
}

$ie.Visible = $false
"You answered:"
$doc.getElementByID("firstname").value
$doc.getElementByID("lastname").value
$ie.quit()

答案 1 :(得分:2)

以下有关使用PowerShell进行Web UI自动化的文章可能会对您有所帮助。 http://msdn.microsoft.com/en-us/magazine/cc337896.aspx

答案 2 :(得分:1)

我知道你指定了一个HTML表单,但你可能最好为此编写一个WinForms GUI。

http://www.techotopia.com/index.php/Creating_GUIs_in_Windows_PowerShell_1.0_with_WinForms

答案 3 :(得分:0)

因为您已经能够从powershell脚本中打开一个新的ie窗口并导航到正确的页面,所以我假设您正在使用InternetExplorer Object。这就是为什么我认为@ravikanth链接对你有好处。从那里(以及互联网上的许多其他帖子),您可以看到如何使用$ie.Document.getElementById("fieldid").value获取值字段,是吗?

另一个选项是System.Net.WebClient,这是获取/发布网页数据的正确方法。你有一个很好的例子here

否则,我认为您应该更清楚自己想做什么,并提供一些代码示例,说明您要做的事情。

答案 4 :(得分:0)

我一直想知道这是否真的有效:

http://social.technet.microsoft.com/wiki/contents/articles/how-to-add-a-graphical-user-interface-to-a-powershell-script-by-using-html-applications.aspx

它基于从VBScript运行PowerShell进程,然后使用剪贴板将输出传输回HTA。

听起来像是一个不错的黑客,虽然我还没有尝试过。

马特

答案 5 :(得分:0)

我使用父窗口的execScript(&#34; SCRIPT HERE&#34;,&#34; Type Of Script&#34;)添加javascript

$html = @"
<html>
    <body>
        <form>
                First name: <input type="text" id="firstname">
            <br>
                Last name: <input type="text" id="lastname">
            <br>
            <input type="button" id="finished" value="Submit" onclick=''>
            </form>
    </body>
</html>
"@

$ie = new-object -com "InternetExplorer.Application"
$ie.navigate("about:blank")
$ie.document.body.innerHTML = $html
$doc = $ie.Document
$doc.parentWindow.execScript("document.getElementById('finished').onclick = function(){document.getElementById('finished').value = 'Submitted';};","javascript")
$ie.Visible = $true

while ($doc.getElementByID("finished").value -ne "Submitted") {
    start-sleep -m 500
    $firstName = $doc.getElementByID("firstname").value
    $lastName = $doc.getElementByID("lastname").value
}

$ie.Visible = $false
"You answered:"
$doc.getElementByID("firstname").value
$doc.getElementByID("lastname").value
$ie.quit()

答案 6 :(得分:0)

@Clayton在其他Windows 10 OS系统上正常工作,但在Windows 10 Azure VM上给出错误

错误- 在此对象上找不到属性“ innerHTML”。验证该属性存在并且可以设置。 在第24行char:1

  • $ ie.document.body.innerHTML = $ html