我正在尝试使用托管C ++函数中的PowerShell类来执行WMI函数。
但我无法解决如何从PowerShell.Invoke()方法调用PSObject列表中返回的对象的方法。
(在命令行上我会做(gwmi ....)。RequestStateChange(2) - 但是我看不到如何使用PowerShell类的几个方法添加()。
System::Management::Automation::PowerShell ^ ps = System::Management::Automation::PowerShell::Create();
ps->AddCommand("Get-WMIObject");
ps->AddParameter("namespace", "root/virtualization");
p->AddParameter("class", "Msvm_ComputerSystem");
// we could add a filter to only return the VM in question but
// I had problems with quoting so choose the
// simplier route.
System::Collections::ObjectModel::Collection<System::Management::Automation::PSObject^>^ result = ps->Invoke();
System::String ^s = gcnew System::String( id.c_str() );
for (int i = 0; i < result->Count; i++ ) {
if ( System::String::Compare( dynamic_cast<System::String ^>(result[i]->Members["Name"]->Value), s) == 0 ) {
// Now what ? I want to call the RequestStateChange method on this VM
return;
}
}
答案 0 :(得分:0)
为什么您希望我们使用PowerShell查询WMI,您可以使用托管类ManagementObjectSearcher:
ManagementObjectSearcher ComputerInfos = new ManagementObjectSearcher("select * from Win32_ComputerSystem");
答案 1 :(得分:0)
我知道这有点陈旧,但我在C#中遇到了类似的问题,发现这个主题只是描述我的问题。我得到的解决方案非常基础,这也就不足为奇了,因为我是PowerShell的初学者。我希望这对任何可能在这里绊倒的人都能解决这个问题。
PSObject具有.BaseObject属性,用于访问底层对象。因此,如果您知道具有所需方法的对象的类型(您可能会这样做,否则我不确定您如何期望任何特定方法),您只需尝试进行转换。
SomeClass x = result[i].BaseObject as SomeClass;
if (x == null)
{
//some handling
}
x.SpecificMethod();
这是C#cast,但你明白了。
希望这有帮助。