gpt4 book ai didi

c# - 如何使用C#Winforms将参数传递给Powershell脚本?

转载 作者:行者123 更新时间:2023-12-03 01:29:54 26 4
gpt4 key购买 nike

我想通过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 Files\App\",
[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

我只显示了脚本值中预先注册的输出,但我尝试显示的(文本框输入)却没有。我错过了什么吗?

最佳答案

注意:以下内容假定scriptFile*.ps1文件的路径,而不是该文件的内容(包含Powershell代码的字符串)。
有关如何处理后一种情况,请参见底部。

您可以大大简化您的调用:

private string RunScript(string scriptFile)
{
using (var ps = PowerShell.Create()) {
ps.AddCommand(scriptFile) // Be sure to pass a *full path*
.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'); // Add a pipeline segment
// Return the 1st (and in this case only) output object, as a string.
return ps.Invoke<string>()[0];
}
}

使用 PowerShell.Create()创建一个类 PowerShell 的实例,该实例基于隐式创建的运行空间提供 高层API :
  • 方法可以链接。
  • 重复调用.AddCommand()会自动添加新的管道段。


  • 至于 您尝试了什么:

    pipeLine.Commands.AddScript(script.ToString());


    .AddScript()方法用于添加任意的PowerShell代码,而不用于添加具有关联参数的 Command实例。
    ( Command实例代表PowerShell命令,例如 Out-String或外部可执行文件的名称/路径或脚本文件的路径[1]( *.ps1))。

    通过使用 Command对存储在 script中的 .ToString()实例进行字符串化,您实际上只是将脚本路径作为要执行的命令传递-您添加到 .AddParameter()的所有参数都丢失了,这就是为什么您只看到默认参数值的原因。脚本的输出。

    相反,您应该使用 添加了Command实例,如下所示:
    pipeLine.Commands.Add(script)

    如果scriptFile不是文件路径,而是脚本文件(包含PowerShell代码的字符串)的内容:

    正如您已经阐明的那样,这是您的实际用例,因为脚本是作为资源嵌入在您使用 RunScript(Properties.Resources.<the script>)传递的可执行文件中的

    修改顶部的简化方法,如下所示:
    // If `scriptFile` is the *contents* of a *.ps1 file,
    // add it as a script [block] with .AddScript(),
    // then add parameters (and the additional pipeline command).
    ps.AddScript(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'); // Add a pipeline segment

    [1] PowerShell仅允许对 foo.ps1环境变量中列出的目录中的可执行文件/脚本执行按名称命名的执行(例如 PATH)。否则,必须指定文件路径,并且使用完整路径是最安全的,因为.NET的当前目录通常不同于PowerShell的目录。

    关于c# - 如何使用C#Winforms将参数传递给Powershell脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59285272/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com