如何将powershell中的管道输出格式化为一行
How to format piped output in powershell to a line
我有一个脚本 powershell 来获取进程的 PercentProcessorTime。
$Processes = (get-wmiobject Win32_PerfFormattedData_PerfProc_Process)
$Processes | %{ New-Object psobject -Property `
@{ Time = $_.PercentProcessorTime;
Name = ($_.name -replace "#\d+", "" )}}`
| ?{ $_.Name -notmatch "_Total|Idle" } `
| Group-Object Name `
| %{ New-Object psobject -Property `
@{ Name = $_.Name;
Sum = ($_.Group | Measure-Object Time -Sum ).Sum }} `
| Format-Table
结果格式如下:
但我想将结果格式化如下以插入到数据库中:
OK |Idle=100 System=6 smss=0 csrss=0 wininit=0 services=0 lsass=0 lsm=0 svchost=18 ICTrigger=0 nvvsvc=0 ICDCMGR64=0 svchost#2=0 winlogon=0 svchost#3=0 svchost#4=0 svchost#5=0 igfxCUIService=0 svchost#6=0 spoolsv=0 svchost#7=0 armsvc=0 ShieldStart=0 svchost#8=0 GateMan=0 HeciServer=0 Jhi_service=0 NHCAAgent=0 nvxdsync=0 nvvsvc#1=0 nscp=0 PaSvc=0 pcdrmsvc=0 NSCHIM=0 ASDSvc=0 secugate64=0 WindowsSecuService=0 WinFil32=0 WmiPrvSE=0 svchost#9=0 papersrv64=0 WUDFHost=0 svchost#10=0 svchost#11=0 WmiP rvSE#1=0 PaTray=0 unsecapp=0 WmiPrvSE#2=0 LMS=0 SWMAgent=0
请帮我解决一下。
非常感谢^^
我不认为有一个 "easy" 内置命令,但更新函数做你想做的事并不需要太多:
$Processes = (get-wmiobject Win32_PerfFormattedData_PerfProc_Process)
$procStrings = @()
$Processes | %{ New-Object psobject -Property `
@{ Time = $_.PercentProcessorTime;
Name = ($_.name -replace "#\d+", "" )}}`
| ?{ $_.Name -notmatch "_Total|Idle" } `
| Group-Object Name `
| %{
$procStrings += "$($_.Name)=$(($_.Group | Measure-Object Time -Sum ).Sum)"}
$procStrings -join " "
基本上,我添加了一个数组来保存字符串 key/value paris,并用代码替换了最终的 New-Object 以创建所需的字符串。最后它与空格连接以创建最终字符串。
你绝对可以跳过数组部分,直接构建字符串,而不是创建数组,我喜欢这种方法:)
它不包括开头的 "OK |",我不知道你是什么构成了 OK,但我相信你可以添加自己来得到你想要的:)
我有一个脚本 powershell 来获取进程的 PercentProcessorTime。
$Processes = (get-wmiobject Win32_PerfFormattedData_PerfProc_Process)
$Processes | %{ New-Object psobject -Property `
@{ Time = $_.PercentProcessorTime;
Name = ($_.name -replace "#\d+", "" )}}`
| ?{ $_.Name -notmatch "_Total|Idle" } `
| Group-Object Name `
| %{ New-Object psobject -Property `
@{ Name = $_.Name;
Sum = ($_.Group | Measure-Object Time -Sum ).Sum }} `
| Format-Table
结果格式如下:
但我想将结果格式化如下以插入到数据库中:
OK |Idle=100 System=6 smss=0 csrss=0 wininit=0 services=0 lsass=0 lsm=0 svchost=18 ICTrigger=0 nvvsvc=0 ICDCMGR64=0 svchost#2=0 winlogon=0 svchost#3=0 svchost#4=0 svchost#5=0 igfxCUIService=0 svchost#6=0 spoolsv=0 svchost#7=0 armsvc=0 ShieldStart=0 svchost#8=0 GateMan=0 HeciServer=0 Jhi_service=0 NHCAAgent=0 nvxdsync=0 nvvsvc#1=0 nscp=0 PaSvc=0 pcdrmsvc=0 NSCHIM=0 ASDSvc=0 secugate64=0 WindowsSecuService=0 WinFil32=0 WmiPrvSE=0 svchost#9=0 papersrv64=0 WUDFHost=0 svchost#10=0 svchost#11=0 WmiP rvSE#1=0 PaTray=0 unsecapp=0 WmiPrvSE#2=0 LMS=0 SWMAgent=0
请帮我解决一下。 非常感谢^^
我不认为有一个 "easy" 内置命令,但更新函数做你想做的事并不需要太多:
$Processes = (get-wmiobject Win32_PerfFormattedData_PerfProc_Process)
$procStrings = @()
$Processes | %{ New-Object psobject -Property `
@{ Time = $_.PercentProcessorTime;
Name = ($_.name -replace "#\d+", "" )}}`
| ?{ $_.Name -notmatch "_Total|Idle" } `
| Group-Object Name `
| %{
$procStrings += "$($_.Name)=$(($_.Group | Measure-Object Time -Sum ).Sum)"}
$procStrings -join " "
基本上,我添加了一个数组来保存字符串 key/value paris,并用代码替换了最终的 New-Object 以创建所需的字符串。最后它与空格连接以创建最终字符串。
你绝对可以跳过数组部分,直接构建字符串,而不是创建数组,我喜欢这种方法:)
它不包括开头的 "OK |",我不知道你是什么构成了 OK,但我相信你可以添加自己来得到你想要的:)