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等等.