使用Write-Progress时,Powershell模块加载在C#代码中停止

时间:2010-08-09 07:39:54

标签: c# powershell

我有这项服务,当收到请求时,运行powershell命令并返回结果。这是调用者类代码:

public class PowerShellScript {

    public PowerShellScript() {
    }

    public Object[] Invoke( String strScriptName, NameValueCollection nvcParams ) {
        Boolean bResult = true;
        int n = 0;
        Object[] objResult = null;
        PowerShell ps = PowerShell.Create();
        String strScript = strScriptName;

        for (n = 0; n < nvcParams.Count; n++) {
            strScript += String.Format( " -{0} {1}", nvcParams.GetKey( n ), nvcParams[n] );
        }

        //ps.AddScript( @"E:\snapins\Init-profile.ps1" );
        ps.AddScript( strScript );
        Collection<PSObject> colpsOutput = ps.Invoke();
        if (colpsOutput.Count > 0)
            objResult = new Object[colpsOutput.Count];

        n = 0;
        foreach (PSObject psOutput in colpsOutput) {
            if (psOutput != null) {
                try {
                    objResult[n] = psOutput.BaseObject;
                }
                catch (Exception ex) { 
                    //exception should be handeled properly in powershell script
                }
            }
            n++;
        }
        colpsOutput.Clear();
        ps.Dispose();

        return objResult;
    }
}

Method Invoke返回powershell脚本返回的所有结果。但问题是,如果被调用脚本在导入的模块或脚本本身中包含Write-Progress,则Powershell类会以某种方式认为这是实际输出并立即完成脚本执行,因此将null作为对象返回。

理想情况下,可以使用Out-Null cmdlet阻止输出,但它不适用于Write-Progress。任何想法如何阻止Write-Progress?

1 个答案:

答案 0 :(得分:1)

我尝试了你的代码,它在一个简单的控制台应用程序中工作,甚至在一个Windows应用程序中,它有一个带有一些输出和调用Write-Progress的简单脚本。因此,问题不是那么容易再现......

  

Powershell类不知怎的相信   这是真正的输出并完成   脚本立即执行

嗯,也许它只是失败了,而不是“以不同方式处理输出”,这就是输出为空的原因。你可以在执行后检查错误集合吗?

  

任何想法如何阻止   写进展?

如果您只是要阻止它,那么这应该有效:在调用您的工作脚本之前,使用此命令调用“profile”脚本安装虚拟替换:

function global:Write-Progress {}

因此,当您的脚本调用Write-Progress时,实际上会调用虚函数Write-Progress,这实际上会“有效地阻止写入进度”。