在调试日志

时间:2017-06-13 16:05:43

标签: c# powershell exception visual-studio-2015 powershell-v4.0

当我从C#执行PowerShell 4.0脚本时,在调试器的输出中,当我在Windows PowerShell ISE中执行相同的脚本时,我得到一个例外。

我引用了Nuget package of PowerShell

<package id="Microsoft.PowerShell.5.ReferenceAssemblies" version="1.0.0" targetFramework="net452" />

这是我的C#代码:

    static void Main(string[] strArgs)
    {
        using (Stream strmPowerScript = new MemoryStream(Properties.Resources.Test))
        {
            using (StreamReader srPowerScript = new StreamReader(strmPowerScript))
            {
                string strScriptPs = srPowerScript.ReadToEnd();
                using (Runspace runspace = RunspaceFactory.CreateRunspace())
                {
                    runspace.Open();

                    using (PowerShell objPowerScript = PowerShell.Create())
                    {
                        objPowerScript.Runspace = runspace;
                        Command cmdPowerScript = new Command(strScriptPs, true);
                        Pipeline pipeline = runspace.CreatePipeline();
                        pipeline.Commands.Add(cmdPowerScript);

                        pipeline.Invoke();
                    }
                }
            }
        }
    }

这是我的PowerShell代码:

   $msg = "testVal"
   $ReportFile = "C:\Temp\Diag\test_err.txt"
   write-output "$msg"  >> $ReportFile

第一个例外是:

'System.DllNotFoundException' in System.Management.Automation.dll

每次运行PowerShell脚本时都会出现此错误。不管脚本里面是什么。我不知道为什么会发生这种错误。

如果文件C:\ Temp \ Diag \ test_err.txt不存在,则会发生第二个错误:

'System.Management.Automation.ItemNotFoundException' in System.Management.Automation.dll

为什么会这样?该文件不存在,但命令创建它...

第三个错误是:

'System.Management.Automation.Host.HostException' in System.Management.Automation.dll

这一次发生写入输出,如果我删除此行,则错误消失。我知道如果我调用写主机或读主机,HostException应该会引发,但是当我从Windows PowerShell ISE执行它时,写输出甚至不会显示任何内容。我尝试使用相同的结果Out-File。我再次尝试Invoke-Expression "cmd.exe /c (""$msg"" >> $ReportFile)"同样的错误。

这些异常仅出现在Visual Studio调试器的输出中。如果文件不存在则创建该文件,如果文件存在则附加文本。

这是一个测试。我的实际脚本比这更大,并且会抛出大量的错误。

另外,我想要一种方法来获取这些错误并显示内部异常,因此我可以看到它们为什么会引发。我试图获得pipeline.Error,但它是空的。我尝试在PowerShell脚本中调用$error,但它也是空的。

PowerShell的版本是:

$PSVersionTable

Name                           Value                                                                                                                                      
----                           -----                                                                                                                                      
PSVersion                      4.0                                                                                                                                        
WSManStackVersion              3.0                                                                                                                                        
SerializationVersion           1.1.0.1                                                                                                                                    
CLRVersion                     4.0.30319.42000                                                                                                                            
BuildVersion                   6.3.9600.16406                                                                                                                             
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0}                                                                                                                       
PSRemotingProtocolVersion      2.2    

但是nuget包的版本是6.1.7601.17515,package.config中的版本是Microsoft.PowerShell.5。这可以相关吗?

谢谢!

0 个答案:

没有答案