使用参数从VBScript调用PowerShell

时间:2015-07-27 21:49:57

标签: vba powershell hta

我有一个非常基本的HTA表格,带有复选框和按钮。我正在尝试使用HTA中的VBScript将复选框状态传递给PowerShell脚本,该脚本在单击按钮时调用。不幸的是,我无法传递参数的值。它一直是空的。

HTA中的代码:

<html>
  <head>
    <title>Test Form</title>
        <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
    <hta:application applicationname="Proof of concept version="1.0" />

    <script language="vbscript">
    Sub Resize()
      window.resizeTo 500,450
    End Sub

    Sub ExecutePowerShell()
      Dim oShell, scriptPath, appCmd, retVal, retData, isTestCheckBoxChecked

      'Collect value from input form
      isTestCheckBoxChecked = document.getElementByID("input_checkBoxTest").checked

      MsgBox isTestCheckBoxChecked

      Set oShell = CreateObject("Wscript.Shell")
      Set scriptPath = ".\TestPowershell.ps1 -isTestCheckBoxChecked " & isTestCheckBoxChecked
      appCmd = "powershell.exe " & scriptPath
      retVal = oShell.Run(appCmd, 1, true)
      retData = document.parentwindow.clipboardData.GetData("text")

    End Sub
    </script>
  </head>

  <body onload="Resize()">
    <h1>Test Form:</h1>
        <div style="margin-top:10px; margin-bottom:30px;">
            The scipt does the following checks:
            <ul>
                <li><input name="input_checkBoxTest" type="checkbox" checked="checked"/> This is a test textbox</li>                
            </ul>
        </div>
    <br /><br />
    <input type="button" id="btn_execute" value="Execute" onclick="ExecutePowerShell()" />
    <br /><br />
  </body>
</html>

Powershell脚本:

#Param([Parameter(Mandatory=$true)][bool]$isTestCheckBoxChecked)

Write-host "The value is '$isTestCheckBoxChecked'"

我得到的输出是:

"The value is ''" 

任何指导都将不胜感激。

1 个答案:

答案 0 :(得分:4)

三件事:

  1. 请勿在以下语句中使用Set。它只是一个字符串,而不是一个对象,因此在这里使用Set会引发错误。

    ' Incorrect
    Set scriptPath = ".\TestPowershell.ps1 -isTestCheckBoxChecked " & isTestCheckBoxChecked
    
    ' Correct
    scriptPath = ".\TestPowershell.ps1 -isTestCheckBoxChecked " & isTestCheckBoxChecked
    
  2. PowerShell中的Param语句已注释掉(#Param)。在发布您的问题时,这可能只是一个错字。

  3. 取消注释Param语句后,您将收到有关从字符串转换为布尔值的错误消息。 PowerShell分别以$false/$true0/1格式接受False/True值的布尔值。所以,你有两个选择:

    ' Prefix the boolean with a '$'
    scriptPath = ".\TestPowershell.ps1 -isTestCheckBoxChecked $" & isTestCheckBoxChecked
    
    ' Or, convert the boolean to a 0/1 (False/True)
    scriptPath = ".\TestPowershell.ps1 -isTestCheckBoxChecked " & Abs(isTestCheckBoxChecked)