首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#中使用powershell对象检索cmdlet物理磁盘

在C#中使用powershell对象检索cmdlet物理磁盘
EN

Stack Overflow用户
提问于 2021-09-04 01:14:13
回答 2查看 385关注 0票数 2

C#9中Powershell对象的问题

我正在尝试使用C#对象检索system.management.powershell中的物理磁盘。当我尝试使用cmdlet“Get-Process”时,powershell对象将正确检索所有进程。

代码语言:javascript
复制
  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进程,所有进程都会正确返回。

代码语言:javascript
复制
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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-09-04 02:47:24

将执行策略设置为RemoteSigned,以便可以导入存储模块

代码语言:javascript
复制
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();
    }
}
票数 2
EN

Stack Overflow用户

发布于 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异常。
代码语言:javascript
复制
- `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异常。

另请参阅:

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69051750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档