Powershell 将流程信息转换为人类可读的值

Powershell 将流程信息转换为人类可读的值,powershell,Powershell,我一直在使用一个函数将字节转换为目录的“友好”大小,如下所示: 脚本: function Get-FriendlySize { param($Bytes) $sizes='Bytes,KB,MB,GB,TB,PB,EB,ZB' -split ',' for($i=0; ($Bytes -ge 1kb) -and ($i -lt $sizes.Count); $i++) {$Bytes/=1kb} $N=2; if($i -eq 0) {$N=0}

我一直在使用一个函数将字节转换为目录的“友好”大小,如下所示:

脚本:

function Get-FriendlySize {
    param($Bytes)
    $sizes='Bytes,KB,MB,GB,TB,PB,EB,ZB' -split ','
    for($i=0; ($Bytes -ge 1kb) -and 
        ($i -lt $sizes.Count); $i++) {$Bytes/=1kb}
    $N=2; if($i -eq 0) {$N=0}
    "{0:N$($N)} {1}" -f $Bytes, $sizes[$i]
}

dir 'C:\Windows\ccmsetup' | Select-Object -Property Name, LastWriteTime, @{N='FriendlySize';E={Get-FriendlySize -Bytes $_.Length}}
输出:

Name                                     LastWriteTime         FriendlySize
----                                     -------------         ------------
cache                                    7/5/2017 10:47:32 AM  1 Bytes     
Logs                                     5/17/2018 5:18:28 PM  1 Bytes     
{6EF23B21-22B7-453C-A975-52723EE71ABA}   1/7/2018 1:06:03 PM   1 Bytes     
ccmsetup.cab                             1/7/2018 1:04:21 PM   9.42 KB     
ccmsetup.exe                             11/7/2017 8:00:00 PM  3.55 MB     
ccmsetup.xml                             12/1/2017 3:55:00 PM  10.51 KB    
CLP1031.MSP                              11/9/2017 9:00:00 AM  1.77 MB     
CLP1036.MSP                              11/9/2017 9:00:00 AM  1.77 MB     
CLP1041.MSP                              11/9/2017 9:00:00 AM  1.77 MB     
CLP2052.MSP                              11/9/2017 9:00:00 AM  1.77 MB     
configmgr1702-client-kb4019926-x64.msp   4/11/2017 11:50:00 AM 7.36 MB     
MicrosoftPolicyPlatformSetup.msi         2/28/2017 9:11:22 AM  2.45 MB     
SCEPInstall.exe                          6/20/2016 12:54:16 PM 27.05 MB    
Silverlight.exe                          4/10/2017 6:34:48 PM  6.70 MB     
WindowsFirewallConfigurationProvider.msi 2/28/2017 9:11:22 AM  589.00 KB   
Handles         : 2521
RAM Working Set : 1 Bytes
CPU             : 169.125
Id              : 10080
ProcessName     : explorer
我现在尝试应用相同的逻辑来获取进程输出,以便内存工作集友好地显示,而不是以默认字节显示,但输出总是“1字节”

脚本:

function Get-FriendlySize {
    param($Bytes)
    $sizes='Bytes,KB,MB,GB,TB,PB,EB,ZB' -split ','
    for($i=0; ($Bytes -ge 1kb) -and 
        ($i -lt $sizes.Count); $i++) {$Bytes/=1kb}
    $N=2; if($i -eq 0) {$N=0}
    "{0:N$($N)} {1}" -f $Bytes, $sizes[$i]
}

Get-Process -Name explorer | Select-Object -Property Handles, @{N='RAM Working Set';E={Get-FriendlySize -Bytes $_.Length}}, CPU, Id, ProcessName
输出:

Name                                     LastWriteTime         FriendlySize
----                                     -------------         ------------
cache                                    7/5/2017 10:47:32 AM  1 Bytes     
Logs                                     5/17/2018 5:18:28 PM  1 Bytes     
{6EF23B21-22B7-453C-A975-52723EE71ABA}   1/7/2018 1:06:03 PM   1 Bytes     
ccmsetup.cab                             1/7/2018 1:04:21 PM   9.42 KB     
ccmsetup.exe                             11/7/2017 8:00:00 PM  3.55 MB     
ccmsetup.xml                             12/1/2017 3:55:00 PM  10.51 KB    
CLP1031.MSP                              11/9/2017 9:00:00 AM  1.77 MB     
CLP1036.MSP                              11/9/2017 9:00:00 AM  1.77 MB     
CLP1041.MSP                              11/9/2017 9:00:00 AM  1.77 MB     
CLP2052.MSP                              11/9/2017 9:00:00 AM  1.77 MB     
configmgr1702-client-kb4019926-x64.msp   4/11/2017 11:50:00 AM 7.36 MB     
MicrosoftPolicyPlatformSetup.msi         2/28/2017 9:11:22 AM  2.45 MB     
SCEPInstall.exe                          6/20/2016 12:54:16 PM 27.05 MB    
Silverlight.exe                          4/10/2017 6:34:48 PM  6.70 MB     
WindowsFirewallConfigurationProvider.msi 2/28/2017 9:11:22 AM  589.00 KB   
Handles         : 2521
RAM Working Set : 1 Bytes
CPU             : 169.125
Id              : 10080
ProcessName     : explorer

我做错了什么?

您需要使用
$\u0.WorkingSet
来获取内存,而不是
$\u0.Length

Get-Process -Name explorer | Select-Object -Property Handles, @{N='RAM Working Set';E={Get-FriendlySize -Bytes $_.WorkingSet}}, CPU, Id, ProcessName

成功了!您是如何确定的?您可以使用
get process | get Member–membertype属性找到get process的所有属性
您还可以查看文档:要使
FriendlySize
在您眼中也很友好,我建议
“{0,-6:N$($N)}{1}”-f$Bytes,$size[$I]