我们希望在数据库中存储和管理PowerShell脚本,并通过C#执行它们。 我们怎样才能在执行之前发现这样一个脚本的参数?所以我们可以将它们设置为已知值或提示用户输入值。
一些澄清:
我们创建了一个管理系统MS。
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();
//...
}
}
答案 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