C#9中Powershell对象的问题
我正在尝试使用C#对象检索system.management.powershell中的物理磁盘。当我尝试使用cmdlet“Get-Process”时,powershell对象将正确检索所有进程。
using (PowerShell PowerShellInstance = PowerShell.Create())
{
// this works
//PowerShellInstance.AddCommand("Get-Process");
PowerShellInstance.AddScript("Get-PhysicalDisk");
//PowerShellInstance.AddCommand("Out-String -Width 240 -Stream");
Collection<PSObject> outlist = PowerShellInstance.Invoke();
}当我尝试使用cmdlet“”时,不会返回数据,也不会引发错误。
我还尝试使用Runspace和管道来执行get进程,所有进程都会正确返回。
Runspace rs = RunspaceFactory.CreateRunspace();
rs.Open();
Pipeline p = rs.CreatePipeline();
p.Commands.Add("get-process");
// p.Commands.Add("get-physicaldisk");
Collection<PSObject> results = p.Invoke();
rs.Close();当我尝试使用运行空间的get-物理磁盘时,程序会抛出一个命令,而不是找到异常。我正在将服务器监视器从VB传输到C#。运行空间(get-物理磁盘)使用.net框架4.1.7在VB中正确工作。
我正在使用SystemManagement5.0、..Automation 7.1.4和PowerShellSDK7.1.4。
发布于 2021-09-04 02:47:24
将执行策略设置为RemoteSigned,以便可以导入存储模块
using (var runspace = RunspaceFactory.CreateRunspace())
{
runspace.InitialSessionState.ExecutionPolicy = Microsoft.PowerShell.ExecutionPolicy.RemoteSigned;
runspace.Open();
using (PowerShell PowerShellInstance = PowerShell.Create(runspace))
{
PowerShellInstance.AddScript("Get-PhysicalDisk");
Collection<PSObject> outlist = PowerShellInstance.Invoke();
}
}发布于 2021-09-04 02:26:35
丹尼尔的有用答案为当前的情况提供了一个有效的解决方案。
这个答案解释了如何报告PowerShell SDK错误以及如何检查它们。
.AddScript() PowerShell SDK方法用于传递多个PowerShell语句以执行;也就是说,您可以传递PowerShell源代码片段,就像在.ps1脚本文件中所发现的那样。.AddCommand()方法接受单个PowerShell命令的名称或可执行路径--没有参数;必须使用单独的调用(即通过单个.AddParameters()调用或通过参数--单独的.AddParameter()和.AddArgument()调用)添加后者。选择一种方法相对于另一种方法对错误处理有影响,特别是在语句终止错误方面,例如在调用不存在的命令时,或者是在调用模块无法导入的命令时:
.AddScript()-added代码在调用.Invoke()并发生语句终止错误时不会抛出.NET异常,相反,返回一个空集合,.HadErrors属性返回true,并且可以通过.Streams.Error集合检查发生的错误。.AddCommand()-added代码可能引发.NET异常,例如System.Management.Automation.CommandNotFoundException类型的异常。相比之下:
throw语句或通过$ErrorActionPreference = 'Stop' /-ErrorAction Stop创建的错误)总是为调用方创建.NET异常。- `throw`, as a PowerShell statement, can only be executed via `.AddScript()`, but setting `$ErrorActionPreference` / using `-ErrorAction` is also possible in connection with `.AddCommand()`.Get-ChildItem nosuchfile)从不为调用方创建.NET异常。另请参阅:
https://stackoverflow.com/questions/69051750
复制相似问题