Powershell 将在foreach循环中创建的属性发送到PSCustomObject

Powershell 将在foreach循环中创建的属性发送到PSCustomObject,powershell,Powershell,我想读出一些在Web服务器上运行的进程的信息。我一直在把我的信息放到一个变量中,然后把它导出到一个日志文件中 如何将我的$Properties放入$ProcessDataPSCustom对象 主要目标是获取服务器上运行的每个进程的gdi句柄 $sig = @' [DllImport("User32.dll")] public static extern int GetGuiResources(IntPtr hProcess, int uiFlags); '@

我想读出一些在Web服务器上运行的进程的信息。我一直在把我的信息放到一个变量中,然后把它导出到一个日志文件中

如何将我的
$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
        }
    }

谢谢

看起来您只是想将GDI对象添加到流程信息中。请使用以下选项:

$processes = [Diagnostics.Process]::GetProcesses() |
             Select-Object Name, Cpu, Handles, @{n='GDI-Objects';e={
               [Win32.NativeMethods]::GetGuiResources($_.Handle, 0).ToString()
             }}

看起来您只是想将GDI对象添加到流程信息中。请使用以下选项:

$processes = [Diagnostics.Process]::GetProcesses() |
             Select-Object Name, Cpu, Handles, @{n='GDI-Objects';e={
               [Win32.NativeMethods]::GetGuiResources($_.Handle, 0).ToString()
             }}

我通常选择A选项


我通常使用选项A,但不能这样做,因为它位于foreach循环中,并且始终是rewritten@SimonS您可以通过将对象创建放在循环中,并将循环输出分配给变量:
$ProcessData=foreach($processs中的p){New object PSCustomObject…}
,使其工作。但是,使用计算属性执行此操作要简单得多。无法执行此操作,因为它位于foreach循环中,并且始终是rewritten@SimonS您可以通过将对象创建放在循环中,并将循环输出分配给变量:
$ProcessData=foreach($processs中的p){New object PSCustomObject…}使其工作
。但是,使用计算属性执行此操作要简单得多。
$Properties = @{
    'ProcessName'=$p.name;
    'CPU'=$p.cpu;
    'Handles'=$p.Handles;
    'GDI-Objects'=$gdiHandles.ToString
}
$ProcessData = New-Object PSCustomObject -Property $Properties