Как вызвать метод на PSObject из управляемого C ++ - PullRequest
0 голосов
/ 02 октября 2011

Я пытаюсь выполнить функцию WMI, используя класс PowerShell из управляемой функции C ++.

Но я не могу понять, как вызвать метод для объекта, который возвращается в списке PSObjectиз метода PowerShell.Invoke ().

(В командной строке я бы просто сделал (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;
    }
}

Ответы [ 2 ]

0 голосов
/ 10 февраля 2014

Я знаю, что это немного устарело, но у меня была похожая проблема в C #, и я нашел эту тему только одной, описывающей мою проблему. Решение, которое я получил, довольно простое, что неудивительно, поскольку я новичок в PowerShell. Я надеюсь, что это решило бы эту проблему и для любого, кто может здесь споткнуться.

PSObject имеет свойство .BaseObject, которое используется для доступа к базовому объекту. Поэтому, если вы знаете тип объекта, который имеет желаемый метод (что вы, вероятно, делаете, иначе я не уверен, как вы можете ожидать какой-либо конкретный метод), вы можете просто попробовать приведение.

SomeClass x = result[i].BaseObject as SomeClass;
if (x == null) 
{
   //some handling
}
x.SpecificMethod();

Это кастинг на C #, но вы поняли.

Надеюсь, это поможет.

0 голосов
/ 02 октября 2011

Почему вы хотите, чтобы PowerShell запрашивал WMI, вы можете использовать управляемый класс ManagementObjectSearcher для этого:

ManagementObjectSearcher ComputerInfos = new ManagementObjectSearcher("select * from Win32_ComputerSystem");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...