使用参数从 VBScript 调用 PowerShell

Call PowerShell from VBScript with parameters

我有一个非常基本的 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. 不要在以下语句中使用 Set。它只是一个字符串,不是一个对象,所以这里使用 Set 应该会报错。

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

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

    ' 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)