如何在c#中发现PowerShell脚本参数

时间:2014-10-15 19:47:30

标签: c# powershell

我们希望在数据库中存储和管理PowerShell脚本,并通过C#执行它们。 我们怎样才能在执行之前发现这样一个脚本的参数?所以我们可以将它们设置为已知值或提示用户输入值。

一些澄清:

我们创建了一个管理系统MS。

  1. 管理员将PowerShell脚本存储在MS数据库中。
  2. 稍后,其他管理员会从MS提供的列表中选择此脚本。
  3. MS发现脚本的参数。
  4. MS提示管理员输入值。
  5. MS使用提供的参数执行脚本。

        string testScript = @"
            {
                param(
                    [ValidateNotNullOrEmpty()]
                    [string]$Name
                )
                get-process $name
            ";
    
    Dictionary<string,object> DiscoverParameters()
    {
        using (PowerShell psi = PowerShell.Create())
        {
            psi.AddScript(testScript);
            var pars = new Dictionary<string,object>();
            //How do we get at the parameters
            return pars;
        }
    }
    
    void ExecuteScript(Dictionary<string,object> pars)
    {
        using (PowerShell psi = PowerShell.Create())
        {
            psi.AddScript(testScript);
            pars.ToList().ForEach(p => psi.AddParameter(p.Key, p.Value));
            Collection<PSObject> PSOutput = psi.Invoke();
            //...
        }
    }
    

2 个答案:

答案 0 :(得分:3)

mjolinor是正确的,使用PowerShell解析器可能是获取参数的最佳方法。这个例子在PowerShell中,下面是C#中的一个例子。我不太确定您要查找的参数是Dictionary<string, object>。这里我们只是将名称粘贴到列表中,尽管还有其他信息可以像静态类型一样提取。

using System.Management.Automation;
using System.Management.Automation.Language;

static void Main(string[] args)
{
    const string testScript = @"
    param(
        [ValidateNotNullOrEmpty()]
        [string]$Name
    )
    get-process $name
";
    foreach(var parameter in GetScriptParameters(testScript))
    {
        Console.WriteLine(parameter);
    }
}

private static List<string> GetScriptParameters(string script)
{
    Token[] tokens;
    ParseError[] errors;
    var ast = Parser.ParseInput(script, out tokens, out errors);
    if (errors.Length != 0)
    {
        Console.WriteLine("Errors: {0}", errors.Length);
        foreach (var error in errors)
        {
            Console.WriteLine(error);
        }
        return null;
    }

    return ast.ParamBlock.Parameters.Select(p => p.Name.ToString()).ToList();
}

答案 1 :(得分:2)

您可以使用PS解析器,并通过AST访问参数信息:

$scriptfile = '<full path to script file>'
$AST = [System.Management.Automation.Language.Parser]::ParseFile( $scriptfile,[ref]$null,[ref]$null)

$AST.ParamBlock.Parameters | ft