从C#调用PowerShell:返回2个PSObjects

时间:2015-04-07 14:16:16

标签: c# powershell

我得到了以下PS脚本:

[other stuff]
    try {
    $Mailbox.user = $auser
    $Mailbox.SetInfo()
    $return = new-object psobject -property @{ReturnCode=0;ReturnString="Account " + $Alias + " Quota successfull modified"}
    $return
}
catch {
    $return = new-object psobject -property @{ReturnCode=1;ReturnString="Account " + $Alias + " ERROR while Quota modification"}
    $return
}

当我在powershell中调用该脚本时,我收到一个结果“Quota success modified”

现在我在C#中调用相同的脚本(具有相同的参数):

var result = powerShellProcessor.ExcecutePowerShell(scriptPath, parameters);

现在结果不包含ONE PsObject,而是包含两个。结果中的第一个元素是NULL,第二个元素包含“Quota success modified”(就像直接从powershell调用时的唯一结果)

当然我可以抓住第二个结果,但我很好奇这是怎么发生的?

(ExecutePowerShell使用Powershell.Invoke作为返回值:)

public Collection<PSObject> ExcecutePowerShell(string scriptFile, IEnumerable<PSCommandParameter> parameters)
        {
     PowerShell ps = PowerShell.Create();
     ps.Runspace = runspace;
     ps.AddScript(GetScriptContent(scriptFile));
     Collection<CommandParameter> commandParameters = new Collection<CommandParameter>();
     foreach (PSCommandParameter scriptParameter in parameters)
     {
     ps.AddParameter(scriptParameter.ParameterName, scriptParameter.ParameterValue);
     }
     Collection<PSObject> ret = ps.Invoke();
     return ret
}

1 个答案:

答案 0 :(得分:2)

根据您描述的症状,看来SetInfo()方法正在返回空对象。您可以扔掉空对象。例如:

[Void] Mailbox.SetInfo()

我也建议采用这种模式

$return = some_expression
$return

可以简称为

some_expression

如果此时需要终止功能,可以编写

return some_expression