使用参数从 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 ''"
任何指导将不胜感激。
三件事:
不要在以下语句中使用 Set
。它只是一个字符串,不是一个对象,所以这里使用 Set
应该会报错。
' Incorrect
Set scriptPath = ".\TestPowershell.ps1 -isTestCheckBoxChecked " & isTestCheckBoxChecked
' Correct
scriptPath = ".\TestPowershell.ps1 -isTestCheckBoxChecked " & isTestCheckBoxChecked
您在 PowerShell 中的 Param
语句被注释掉 (#Param
)。也许这只是您发布问题时的错别字。
取消注释 Param
语句后,您将收到关于从字符串转换为布尔值的错误。对于 False/True
值,PowerShell 分别接受格式为 $false/$true
或 0/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)
我有一个非常基本的 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 ''"
任何指导将不胜感激。
三件事:
不要在以下语句中使用
Set
。它只是一个字符串,不是一个对象,所以这里使用Set
应该会报错。' Incorrect Set scriptPath = ".\TestPowershell.ps1 -isTestCheckBoxChecked " & isTestCheckBoxChecked ' Correct scriptPath = ".\TestPowershell.ps1 -isTestCheckBoxChecked " & isTestCheckBoxChecked
您在 PowerShell 中的
Param
语句被注释掉 (#Param
)。也许这只是您发布问题时的错别字。取消注释
Param
语句后,您将收到关于从字符串转换为布尔值的错误。对于False/True
值,PowerShell 分别接受格式为$false/$true
或0/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)