2016-01-24 22 views
0

我想讀出在Web服務器上運行的進程的一些信息。我堅持將我的信息存入變量並將其導出到日誌文件中將在foreach循環中創建的屬性發送到PSCustomObject

如何將我的$Properties加入$ProcessData PSCustom對象?

主要目標是獲取我的服務器上運行的每個進程的gdi句柄。

$sig = @' 
     [DllImport("User32.dll")] public static extern int GetGuiResources(IntPtr hProcess, int uiFlags); 
    '@ 
    Add-Type -MemberDefinition $sig -name NativeMethods -namespace Win32 
    $processes = [System.Diagnostics.Process]::GetProcesses() 
    [int]$gdiHandleCount = 0 
    $ProcessData = New-Object PSCustomObject 
    ForEach ($p in $processes) 
    { 
     try{ 
      $gdiHandles = [Win32.NativeMethods]::GetGuiResources($p.Handle, 0) 
      $gdiHandleCount += $gdiHandles 
      $properties = @{ 
       'ProcessName'=$p.name; 
       'CPU'=$p.cpu; 
       'Handles'=$p.Handles; 
       'GDI-Objects'=$gdiHandles.ToString 
      } 
     } 
     catch { 
      #"Error accessing " + $p.Name 
     } 
    } 

謝謝!

回答

2

看起來您只是想將GDI對象添加到流程信息中。使用了一個calculated property

$processes = [Diagnostics.Process]::GetProcesses() | 
      Select-Object Name, Cpu, Handles, @{n='GDI-Objects';e={ 
       [Win32.NativeMethods]::GetGuiResources($_.Handle, 0).ToString() 
      }} 
0
$ProcessData = New-Object PSCustomObject -Property @{ 
    'ProcessName'=$p.name; 
    'CPU'=$p.cpu; 
    'Handles'=$p.Handles; 
    'GDI-Objects'=$gdiHandles.ToString 
} 

OR

$Properties = @{ 
    'ProcessName'=$p.name; 
    'CPU'=$p.cpu; 
    'Handles'=$p.Handles; 
    'GDI-Objects'=$gdiHandles.ToString 
} 
$ProcessData = New-Object PSCustomObject -Property $Properties 

我通常選擇去一個

+0

不能做到這一點,因爲它是在一個foreach循環,總是被改寫 – SimonS

+0

@SimonS你可以通過將對象創建放在循環中並將循環輸出分配給變量來實現它:'$ ProcessData = foreach($ processes中的$ p){New-Object PSCustomObject ''。但是,使用計算屬性來做這件事更簡單。 –