如何使用c#winforms将参数传递到Powershell脚本?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用c#winforms将参数传递到Powershell脚本?相关的知识,希望对你有一定的参考价值。
我想通过winforms执行powershell脚本并获得格式正确的输出。我设法使其正常工作,但现在我需要将参数传递给脚本。我无法做到这一点。
这是我的RunScript函数:
private string RunScript(string scriptFile)
{
Runspace runSpace = RunspaceFactory.CreateRunspace();
runSpace.Open();
Pipeline pipeLine = runSpace.CreatePipeline();
Command script = new Command(scriptFile);
script.Parameters.Add("COM_USERNAME", usernameBox.Text);
script.Parameters.Add("COM_PASSWORD", passwordBox.Text);
script.Parameters.Add("installDir", installDirBox.Text);
script.Parameters.Add("TEMPVAULT_PATH", tempVaultBox.Text);
script.Parameters.Add("MAX_REQ_LIMIT", maxReqLimBox.Text);
script.Parameters.Add("MAX_BUFF_LIMIT", maxBuffLimBox.Text);
pipeLine.Commands.AddScript(script.ToString());
pipeLine.Commands.Add("Out-String");
Collection<PSObject> results = pipeLine.Invoke();
runSpace.Close();
StringBuilder strBuilder = new StringBuilder();
foreach (PSObject item in results)
{
strBuilder.AppendLine(item.ToString());
}
return strBuilder.ToString();
}
这是我正在尝试的脚本:
param (
[bool] $STARTSERVICE = $false ,
[bool] $INSTALL = $false ,
[bool] $INSTALL_DASHBOARD = $false,
[bool] $DASHBOARD_SETTINGS = $false,
[bool] $DASHBOARD_CREATENEWDB = $false,
[bool] $DALIM_SETTINGS = $false,
[bool] $INSTALLIIS = $true,
[bool] $FIRST_INSTALL = $true,
[bool] $RECOVERY = $false,
[string] $COM_USERNAME,
[string] $COM_PASSWORD,
[string] $RECOVERY_ADM_NAME,
[string] $RECOVERY_ADM_PWD,
[string] $Windows2012DVDLetter = "F:",
[string] $COM_UNCPATH,
[string] $installDir = "C:Program FilesLascom",
[string] $TEMPVAULT_PATH = "C:TempVault",
$SOAP_MaxPostSize = 4294967295,
$MAX_REQ_LIMIT = 500000000,
$MAX_BUFF_LIMIT = 500000000
)
Write-Output "`nUsername = " $COM_USERNAME
Write-Output "`nPassword = " $COM_PASSWORD
Write-Output "`nCOM_UNCPATH = " $COM_UNCPATH
Write-Output "`nMaximum Request Limit = " $MAX_REQ_LIMIT
Write-Output "`nMaximum Buff Limit = " $MAX_BUFF_LIMIT
Write-Output "`nIsFirstInstall = " $FIRST_INSTALL
Write-Output "`nInstallation Directory = " $installDir
Write-Output "`nTempVault Path = " $TEMPVAULT_PATH
Write-Output "`nRestriction level = " $RESTRICT_LVL
我的输出仅显示脚本值中的预注册值,但我尝试显示的内容(文本框输入)不显示。我错过了什么吗?
答案
您可以大大简化您的调用:
private string RunScript(string scriptFile)
{
using (var ps = PowerShell.Create()) {
ps.AddCommand(scriptFile)
.AddParameter("COM_USERNAME", usernameBox.Text)
.AddParameter("COM_PASSWORD", passwordBox.Text)
.AddParameter("installDir", installDirBox.Text)
.AddParameter("TEMPVAULT_PATH", tempVaultBox.Text)
.AddParameter("MAX_REQ_LIMIT", maxReqLimBox.Text)
.AddParameter("MAX_BUFF_LIMIT", maxBuffLimBox.Text)
.AddCommand('Out-String');
return ps.Invoke()[0].ToString();
}
}
使用PowerShell.Create()
创建一个PowerShell
实例,该实例基于隐式创建的运行空间提供更高级别的API:
- 方法可以链接。
- 反复调用
.AddCommand()
会自动添加新的管道段。
关于您尝试了什么:
pipeLine.Commands.AddScript(script.ToString());
.AddScript()
方法用于添加任意的PowerShell代码,而不用于添加具有关联参数的Command
实例。
通过用Command
对存储在script
中的.ToString()
实例进行字符串化,您实际上只是将脚本路径作为要执行的命令-用.AddParameter()
添加的所有参数都是丢失。
相反,您应该如下添加您的Command
实例:
pipeLine.Commands.Add(script)
以上是关于如何使用c#winforms将参数传递到Powershell脚本?的主要内容,如果未能解决你的问题,请参考以下文章
在winform中(c#2008),用数组传递数据行给子窗体乱套了