当我从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
。这可以相关吗?
谢谢!