Проблема с получением результата команды PowerShell в C # - PullRequest
0 голосов
/ 22 февраля 2019

Довольно плохо знаком с C #, и я пытаюсь написать простой инструмент, который проверяет определенные роли и функции на сервере и показывает, установлены они или нет.Просто!

Проблема в том, что я не могу на всю жизнь понять, как записать значение установленного состояния этой команды Powershell (отформатировано в строке 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();

Вместо установленного состояния значение в VS cmdout отображается как "System.Collections.ObjectModel.Collection1[System.Management.Automation.PSObject]", что, я думаю, здорово.Я понимаю, что .Invoke () вернет коллекцию, поэтому .ToString() должен взять результат ("True" или "False" и вернуть его в cmdout в виде строки.

Чего мне не хватаетздесь? Удивительно, что Powershell может быть настолько простым в оболочке, но таким сложным в C#. Я искал и читал в течение 2 дней и не смог понять это.

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Как насчет того, чтобы просто получить строку значения непосредственно по сравнению с коллекцией и попытаться принудительно указать строку в 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
0 голосов
/ 22 февраля 2019

После вызова вам нужно попытаться получить выходное значение, используя его имя переменной, как показано ниже: ps.Runspace.SessionStateProxy.GetVariable ("counter").

Вам необходимо проверить имя переменной вашего результата.

Или вы можете сделать, как показано ниже, так как результатом будет коллекция PSObject

 foreach (PSObject result in ps.Invoke())
    {
    MessageBox.Show(result.BaseObject.ToString() + "\n");   
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...