2013-12-24 2 views
0

Я получаю список всех виртуальных машин, размещенных на машине SCVMM. Однако я не получаю список всех виртуальных машин. Только около 100-110 показаны. Я извлекаю некоторые конкретные свойства из списка виртуальных машин и сохраняю их в базе данных, которые, в свою очередь, будут отображать информацию на портале. EXECUTEPS - это функция, которая отображает список виртуальных машин и сохраняет их в переменной Collection.Bowow мой код,Невозможно получить все данные из powershell с помощью powershell.Invoke()

Collection<PSObject> objVMDetailArrayCollection = ExecutePS("VMDETAILS", ""); 
string[] VMName=new string[objVMDetailArrayCollection.Count()]; 
int VMNumber=0; 
foreach (PSObject objPSObject in objVMDetailArrayCollection) 
{ 
    VMName[VMNumber] = objPSObject.Properties["Name"].Value.ToString(); 
    double ts = double.Parse(objPSObject.Properties["TotalSize"].Value.ToString()); 
    string vms = objPSObject.Properties["VirtualMachineState"].Value.ToString(); 
    double ma = double.Parse(objPSObject.Properties["MemoryAssignedMB"].Value.ToString()); 
    string status = objPSObject.Properties["Status"].Value.ToString(); 
    int cu = int.Parse(objPSObject.Properties["CPUUtilization"].Value.ToString()); 
    int pcu = int.Parse(objPSObject.Properties["PerfCPUUtilization"].Value.ToString()); 
    int pf = int.Parse(objPSObject.Properties["PerfMemory"].Value.ToString()); 
    int pdbr = int.Parse(objPSObject.Properties["PerfDiskBytesRead"].Value.ToString()); 
    int pnbw = int.Parse(objPSObject.Properties["PerfNetworkBytesWrite"].Value.ToString()); 
    DateTime ct = DateTime.Parse(objPSObject.Properties["CreationTime"].Value.ToString()); 
    string os = objPSObject.Properties["OperatingSystem"].Value.ToString(); 
    int cc = int.Parse(objPSObject.Properties["CPUCount"].Value.ToString()); 
    int memory = int.Parse(objPSObject.Properties["Memory"].Value.ToString()); 
    string hn = objPSObject.Properties["HostName"].Value.ToString(); 
    DateTime at = DateTime.Parse(objPSObject.Properties["AddedTime"].Value.ToString()); 

    for(int i=0;i<objArrayHosts1.Length;i++) 
    { 
     if(objArrayHosts1[i].Name==hn.Split('.')[0]) 
     { 
      VMDetails[] objArrayVMDetails = objVMDetailsClient.GetVMDetailsByHostId(objArrayHosts1[i].HostId); 
      if (objArrayVMDetails.Where(h => h.Name == VMName[VMNumber]).Count() > 0) 
      { 
       objVMDetailsClient.UpdateVMDetails(new VMDetails() { 
        VMId = (objArrayVMDetails.Where(h => h.Name == VMName[VMNumber]).ToList())[0].VMId, 
        HostId = objArrayHosts1[i].HostId, 
        HostName = objArrayHosts1[i].Name, 
        Name = VMName[VMNumber], 
        VirtualMachineState = vms, 
        TotalSize = ts, 
        MemoryAssignedMB = ma, 
        Status = status, 
        CPUUtilization = cu, 
        PerfCPUUtilization = pcu, 
        PerfMemory = pf, 
        PerfDiskBytesRead = pdbr, 
        PerfNetworkBytesWrite = pnbw, 
        CreationTime = ct, 
        OperatingSystem = os, 
        CPUCount = cc, 
        Memory = memory, 
        AddedTime = at }); 
      } 
      else 
      { 
       objVMDetailsClient.CreateVMDetails(new VMDetails() { 
        HostId = objArrayHosts1[i].HostId, 
        HostName = objArrayHosts1[i].Name, 
        Name = VMName[VMNumber], 
        VirtualMachineState = vms, 
        TotalSize = ts, 
        MemoryAssignedMB = ma, 
        Status = status, 
        CPUUtilization = cu, 
        PerfCPUUtilization = pcu, 
        PerfMemory = pf, 
        PerfDiskBytesRead = pdbr, 
        PerfNetworkBytesWrite = pnbw, 
        CreationTime = ct, 
        OperatingSystem = os, 
        CPUCount = cc, 
        Memory = memory, 
        AddedTime = at }); 
      } 
     } 
    } 
    VMNumber++; 
} 
+0

Если вы не получаете все виртуальные машины, то разве это не ошибка метода вызова метода ExecutePS («VMDetails», «»)? Каково значение, возвращаемое 'objVMDetailArrayCollection.Count()' и представляет ли это все виртуальные машины, которые вы ожидали? –

+0

Кроме того, какую версию PowerShell вы используете? Если вы используете V3 или V4, вы можете воспользоваться тем, что PSObject является динамическим. –

+0

objVMDetailArrayCollection.Count() дает общее количество виртуальных машин во всех хостах, размещенных на этой машине scvmm. Не могли бы вы рассказать о том, как использовать PSObject как Dynamic ?? – user3131789

ответ

0

Если вы используете PowerShell V3 или выше, вы можете упростить код, воспользовавшись тем, что PSObject поддерживает динамическое, например:

foreach (dynamic psobj in objVMDetailArrayCollection) 
{ 
    VMName[VMNumber] = psobj.Name.Value.ToString(); 
    double ts = double.Parse(psobj.TotalSize.Value.ToString()); 
    string vms = psobj.VirtualMachineState.Value.ToString(); 
    double ma = double.Parse(psobj.MemoryAssignedMB.Value.ToString()); 
    ... 
Смежные вопросы