通过C#中的属性检索嵌套的Powershell对象的值

C#新手在这里.我不确定我的目标是否可行.

基本上,我试图在C#中的Power
shell对象中读取系统对象数组的属性.

为简单起见,这是一个具有类似输出的基本Powershell代码:

$object = New-Object -TypeName PSObject
$object | Add-Member -MemberType NoteProperty -Name "Name" -Value "Yad"
$object | Add-Member -MemberType NoteProperty -Name "Title" -Value "C# Noob"
$object | Add-Member -MemberType NotePropety -Name "Machine Services" -Value (Get-Service)

return $object

在C#方面,我可以通过映射属性来获取结果,如下所示:

var shell = PowerShell.Create();
shell.Commands.AddScript("C:\\Scripts\\Powershell\\TestScript.ps1 -user " + userName);

Collection<PSObject> results = shell.Invoke();

Profile userProfile = new Profile(); //Profile class is declared prior this line


foreach (PSObject psObject in results)
        {
            userProfile.Name = Convert.ToString(psObject.Properties["Name"].Value);
            userProfile.Title= Convert.ToString(psObject.Properties["Title"].Value);
            userProfile.MachineServices= psObject.Properties["Machine Services"].Value;
         }

有了这个,’userProfile’对象相当于Powershell输出.

现在,’MachineServices’属性是一个对象,它包含自己的一组属性(Powershell中的状态,名称和显示名称).是否可以调用这些属性并检索它们的值?

我尝试了类似于下面的内容,当然,我得到一个错误,因为Powershell脚本是完全独立的,并且运行时之前C#代码不知道这些属性.

userProfile.MachineServices.Status

有任何想法吗?

最佳答案 如果您使用.GetType()调查PowerShell中的Get-Service,您会发现它返回一个Object数组,其中成员的类型为ServiceController.

我没有在C#中尝试过,但你应该能够将Profile.MachineServices声明为System.ServiceProcess.ServiceController [],然后使用赋值

userProfile.MachineServices= (System.ServiceProcess.ServiceController[])(psObject.Properties["Machine Services"].Value);

一旦C#知道正确的对象类型,您就可以访问属性和方法,获取IntelliSense等等.

点赞