2015-07-07 3 views
0

Я пытаюсь использовать ASP.NET для возврата общей загрузочной ОЗУ на виртуальную машину на сервере Hyper-V. Функция у меня есть это:Проблемы с возвратом командной строки Get-VMMemory

public static double GetRamVM(string vm, string host) 
    { 
     string cmdToRun = "get-vmmemory -name " + vm + " -computername " + host + " | select Startup" ; 
     var shell = PowerShell.Create(); 
     shell.Commands.AddScript(cmdToRun); 
     var mem = shell.Invoke(); 

     foreach (PSObject obj in mem) 
     { 

      var startMem = obj.Members["Startup"].Value; 

      return (double)startMem; 
     } 

     return 9999.9999; 
    } 

Однако, когда я вернуть его - это всегда возвращается как 9999.9999. Я знаю, что команда работает, так как когда я запускаю ее вручную в окне powershell, я получаю результат, который мне нужен.

Пожалуйста, помогите - как я сойду с ума.

Edit: Руководство запуска сценария выглядит следующим образом

PS C:\Users\mark> Get-VMMemory -vmname "test test" -computername "testhost" | select Startup 

                        Startup 
                        ------- 
                        536870912 
+0

Почему у вас есть это, тогда 'return 9999.9999;'? – Matt

+0

Отлаживайте свой код. Если 'mem' не содержит элементов, возможно, это проблема с разрешением. – CodeCaster

+0

Это не разрешения (идентификатор пула приложений, который используется, совпадает с тем, что я запускаю как скрипт вручную). Кроме того, если я просто выгружаю mem.ToString(), он возвращает System.Collections.ObjectModel.Collection'1 [System.Management.Automation.PSObject] –

ответ

0

Вы можете попробовать использовать -ExpandProperty на PowerShell Select командлета. Это вернет номер для используемой памяти, а не PS-object, поэтому вам не нужно извлекать значение в свой код C.

public static double GetRamVM(string vm, string host) 
{ 
    string cmdToRun = "get-vmmemory -name " + vm + " -computername " + host + " | select -ExpandProperty Startup" ; 
    var shell = PowerShell.Create(); 
    shell.Commands.AddScript(cmdToRun); 
    var mem = shell.Invoke(); 

    return (double)mem; 
} 
+0

Это сработало - я также обнаружил небольшую ошибку в синтаксисе кода C# в том, что я использовал -name и не -vmname (все остальные cmdleets используют -name!?!) –

Смежные вопросы