Я получаю список всех виртуальных машин, размещенных на машине 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++;
}
Если вы не получаете все виртуальные машины, то разве это не ошибка метода вызова метода ExecutePS («VMDetails», «»)? Каково значение, возвращаемое 'objVMDetailArrayCollection.Count()' и представляет ли это все виртуальные машины, которые вы ожидали? –
Кроме того, какую версию PowerShell вы используете? Если вы используете V3 или V4, вы можете воспользоваться тем, что PSObject является динамическим. –
objVMDetailArrayCollection.Count() дает общее количество виртуальных машин во всех хостах, размещенных на этой машине scvmm. Не могли бы вы рассказать о том, как использовать PSObject как Dynamic ?? – user3131789