2016-01-24 25 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 ''。但是,使用计算属性来做这件事更简单。 –