在 C# 中无法获取 PowerShell 命令的结果

Posted

技术标签:

【中文标题】在 C# 中无法获取 PowerShell 命令的结果【英文标题】:Trouble getting result of PowerShell command in C# 【发布时间】:2019-07-16 03:12:40 【问题描述】:

对 C# 很陌生,我正在尝试编写一个简单的工具来检查服务器上的特定角色和功能并显示它们是否已安装。简单的!

问题是我一辈子都不知道如何捕获这个 Powershell 命令的 Installed State 值(以 C# 字符串格式):

"Get-WindowsFeature | ? $_.Name -match \"Web-Mgmt-Console\" | Select -exp Installed State"

命令本身在 Powershell 中运行(删除 \ 时)并且只返回“false”。我的代码试图捕捉这个结果。

cmd = "Get-WindowsFeature | ? $_.Name -match \""+winFeatures[i]+
                            "\" | Select -exp Installed State";
cmdout = ps.AddScript(cmd).Invoke().ToString();

cmdout 的 VS 中的值显示为 "System.Collections.ObjectModel.Collection1[System.Management.Automation.PSObject]",而不是已安装状态,我猜这很酷。我知道 .Invoke() 将返回一个集合,因此 .ToString() 应该获取结果(“True”或“False”并将其作为字符串返回给 cmdout。

我在这里缺少什么?令人惊奇的是,Powershell 在 shell 中可以如此简单,但在 C# 中却如此困难。我已经搜索和阅读了 2 天,但无法弄清楚这一点。

【问题讨论】:

以为我已经弄明白了,但没有。删除此评论。 【参考方案1】:

调用后,您需要尝试使用其变量名获取输出值,如下所示: ps.Runspace.SessionStateProxy.GetVariable("counter")。

您需要检查结果的变量名称。

否则你可以像下面那样做,因为结果将是 PSObject 的集合

 foreach (PSObject result in ps.Invoke())
    
    MessageBox.Show(result.BaseObject.ToString() + "\n");   
    

【讨论】:

【参考方案2】:

如何直接获取值字符串而不是集合并尝试在 cmd 中强制执行刺痛...

(Get-WindowsFeature | ? $_.Name -match 'Web-Mgmt-Console')

Display Name                                            Name                       Install State
------------                                            ----                       -------------
        [X] IIS Management Console                      Web-Mgmt-Console               Installed



(Get-WindowsFeature | ? $_.Name -match 'Web-Mgmt-Console') | Get-Member


   TypeName: Microsoft.Windows.ServerManager.Commands.Feature

Name                      MemberType Definition                                                                                                            
----                      ---------- ----------                                                                                                            
Equals                    Method     bool Equals(System.Object obj), bool IEquatable[Feature].Equals(Microsoft.Windows.ServerManager.Commands.Feature ot...
GetHashCode               Method     int GetHashCode()                                                                                                     
GetType                   Method     type GetType()                                                                                                        
SetProperties             Method     void SetProperties(string displayName, string description, bool installed, Microsoft.Windows.ServerManager.Commands...
ToString                  Method     string ToString()                                                                                                     
AdditionalInfo            Property   hashtable AdditionalInfo get;                                                                                       
BestPracticesModelId      Property   string BestPracticesModelId get;                                                                                    
DependsOn                 Property   string[] DependsOn get;                                                                                             
Depth                     Property   int Depth get;                                                                                                      
Description               Property   string Description get;                                                                                             
DisplayName               Property   string DisplayName get;                                                                                             
EventQuery                Property   string EventQuery get;                                                                                              
FeatureType               Property   string FeatureType get;                                                                                             
Installed                 Property   bool Installed get;                                                                                                 
InstallState              Property   Microsoft.Windows.ServerManager.Commands.InstallState InstallState get;                                             
Name                      Property   string Name get;                                                                                                    
Notification              Property   Microsoft.Windows.ServerManager.ServerComponentManager.Internal.Notification[] Notification get;                    
Parent                    Property   string Parent get;                                                                                                  
Path                      Property   string Path get;                                                                                                    
PostConfigurationNeeded   Property   bool PostConfigurationNeeded get;                                                                                   
ServerComponentDescriptor Property   psobject ServerComponentDescriptor get;                                                                             
SubFeatures               Property   string[] SubFeatures get;                                                                                           
SystemService             Property   string[] SystemService get;                                                                                         



(Get-WindowsFeature | ? $_.Name -match 'Web-Mgmt-Console').Installed
True

(Get-WindowsFeature | ? $_.Name -match 'Web-Mgmt-Console').InstallState
Installed

【讨论】:

以上是关于在 C# 中无法获取 PowerShell 命令的结果的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PowerShell 或 C# 中获取进程的命令行信息

c# - 如何在运行时从模块代码中获取 PowerShell 模块版本

PowerShell 命令行参数和“--”

如何在 C# 中获取 PSObject.Properties 的 ScriptProperty 值?

通过 C# 代码执行 Powershell 命令

如何在 C# 中运行 powershell 命令