设为首页 收藏本站
查看: 1089|回复: 0

PowerShell基础教程(7)——使用格式命令更改输出视图

[复制链接]

尚未签到

发表于 2017-5-20 08:29:43 | 显示全部楼层 |阅读模式
PowerShell基础教程(7)——使用格式命令更改输出视图             <o:p></o:p>

Windows PowerShell 提供了一组 cmdlet,使用这些 cmdlet 您可以控制要为特定对象显示的属性。这些 cmdlet 的名称均以动词 Format 开头。它们允许您选择一个或多个要显示的属性。
Format cmdlet 包括 Format-WideFormat-ListFormat-TableFormat-Custom。本文中将仅介绍 Format-WideFormat-ListFormat-Table cmdlet。
每个格式 cmdlet 都具有默认属性;如果未指定要显示的特定属性,则会使用这些默认属性。此外,每个 cmdlet 都使用同一参数名称 Property 来指定要显示的属性。由于 Format-Wide 仅显示单个属性,因此其 Property 参数只获取单个值,但 Format-ListFormat-Table 的属性参数将接受一组属性名称。
如果对 2 个正在运行的 Windows PowerShell 实例使用命令 Get-Process -Name powershell,所得到的输出将与以下所示类似:
Handles  NPM(K)      PM(K)      WS(K) VM(M)   CPU(s)       Id ProcessName<o:p></o:p>
-------  ------      -----      ----- -----   ------       -- -----------<o:p></o:p>
995       9      30308      27996   152       2.73   2760 powershell<o:p></o:p>
331       9      23284      29084   143       1.06   3448 powershell<o:p></o:p>
<o:p> </o:p>
本节的其余部分将探讨如何使用 Format cmdlet 来更改此命令的输出显示方式。
使用 Format-Wide 输出单个项目<o:p></o:p>
默认情况下,Format-Wide cmdlet 仅显示对象的默认属性。与每个对象相关联的信息将显示在单独一列中:
PS> Get-Process -Name   powershell | Format-Wide<o:p></o:p>
<o:p> </o:p>
powershell                              powershell<o:p></o:p>
<o:p> </o:p>也可以指定非默认属性:
PS> Get-Process -Name   powershell | Format-Wide -Property Id<o:p></o:p>
<o:p> </o:p>
2760                                    3448<o:p></o:p>
<o:p> </o:p>使用 Column 控制 Format-Wide 显示<o:p></o:p>
使用 Format-Wide cmdlet,每次只能显示一个属性。这样对于显示每行仅显示一个元素的简单列表十分有用。若要获取简单列表,请键入下面命令来将 Column 参数的值设置为 1:
Get-Command Format-Wide   -Property Name -Column 1<o:p></o:p>
<o:p> </o:p>使用 Format-List 显示列表视图<o:p></o:p>
Format-List cmdlet 以列表的形式显示对象,并在单独行上标记和显示每个属性:
PS> Get-Process -Name   powershell | Format-List<o:p></o:p>
<o:p> </o:p>
Id      : 2760<o:p></o:p>
Handles : 1242<o:p></o:p>
CPU     : 3.03125<o:p></o:p>
Name     :powershell<o:p></o:p>
<o:p> </o:p>
Id      : 3448<o:p></o:p>
Handles : 328<o:p></o:p>
CPU     : 1.0625<o:p></o:p>
Name     :powershell<o:p></o:p>
<o:p> </o:p>
可以根据需要指定任意数量的属性:
PS> Get-Process -Name   powershell | Format-List -Property ProcessName,FileVersion<o:p></o:p>
,StartTime,Id<o:p></o:p>
<o:p> </o:p>
<o:p> </o:p>
ProcessName       :powershell<o:p></o:p>
FileVersion       :   1.0.9567.1<o:p></o:p>
StartTime   : 2006-05-24 <st1:timeminute42hour w:st="on">13:42:00</st1:timeminute42hour><o:p></o:p>
Id          : 2760<o:p></o:p>
<o:p> </o:p>
ProcessName       :powershell<o:p></o:p>
FileVersion       :   1.0.9567.1<o:p></o:p>
StartTime   : 2006-05-24 <st1:timeminute54hour w:st="on">13:54:28</st1:timeminute54hour><o:p></o:p>
Id          : 3448<o:p></o:p>
<o:p> </o:p>使用 Format-List 和通配符来获取详细信息<o:p></o:p>
Format-List cmdlet 允许您将通配符用作其 Property 参数的值。这样可以显示详细信息。通常,对象所包含的信息多于您需要的信息,因此,默认情况下 Windows PowerShell 将不会显示所有属性值。若要显示对象的所有属性,请使用 Format-List -Property * 命令。以下命令将为单个进程生成超过 60 行输出:
Get-Process -Name powershell   | Format-List -Property *<o:p></o:p>
<o:p> </o:p>
尽管 Format-List 命令对于显示详细信息十分有用,但如果希望获得包含多个项目的输出概览,则较简单的表格格式视图通常会更有用。
使用 Format-Table 显示表格格式输出<o:p></o:p>
如果使用 Format-Table cmdlet(未指定任何属性名)来设置 Get-Process 命令的输出格式,所获得的输出效果将与不执行任何格式设置的情况完全相同。这是因为与大多数 Windows PowerShell 对象一样,进程通常是以表格格式显示的。
PS> Get-Process -Name   powershell | Format-Table<o:p></o:p>
<o:p> </o:p>
Handles  NPM(K)      PM(K)      WS(K) VM(M)   CPU(s)       Id ProcessName<o:p></o:p>
-------  ------      -----      ----- -----   ------       -- -----------<o:p></o:p>
1488       9      31568      29460   152       3.53   2760 powershell<o:p></o:p>
332       9      23140        632   141       1.06   3448 powershell<o:p></o:p>
<o:p> </o:p>改进 Format-Table 输出 (AutoSize)<o:p></o:p>
尽管表格格式的视图适用于显示大量可比较信息,但其可能难以判断显示区域是否过窄而无法容纳数据。例如,如果试图显示进程路径、ID、名称和公司,则会导致进程路径和公司列的输出被截断:
PS> Get-Process -Name   powershell | Format-Table -Property Path,Name,Id,Company<o:p></o:p>
<o:p> </o:p>
Path                Name                                 Id Company<o:p></o:p>
----                ----                                 -- -------<o:p></o:p>
C:\Program Files...   powershell                         2836   Microsoft Corpor...<o:p></o:p>
<o:p> </o:p>如果在运行 Format-Table 命令时指定了 AutoSize 参数,则 Windows PowerShell 将基于要显示的实际数据来计算列宽。这样会使 Path 列可读,但公司列仍处于截断状态:
PS> Get-Process -Name   powershell | Format-Table -Property Path,Name,Id,Company -<o:p></o:p>
AutoSize<o:p></o:p>
<o:p> </o:p>
Path                                                      Name         Id Company<o:p></o:p>
----                                                    ----         -- -------<o:p></o:p>
C:\Program Files\Windows   PowerShell\v1.0\powershell.exe powershell 2836 Micr...<o:p></o:p>
<o:p> </o:p>Format-Table cmdlet 仍然可能会截断数据,但截断只会发生在屏幕的末尾部分。除最后一个显示的属性外,会将其他属性指定为其最长数据元素所需的宽度以进行正常显示。如果在 Property 值列表中将 PathCompany 交换位置,您将会看到公司名称为可见的,但路径被截断:
PS> Get-Process -Name   powershell | Format-Table -Property Company,Name,Id,Path -<o:p></o:p>
AutoSize<o:p></o:p>
<o:p> </o:p>
Company               Name         Id Path<o:p></o:p>
-------               ----         -- ----<o:p></o:p>
Microsoft Corporation   powershell 2836 C:\Program Files\Windows PowerShell\v1...<o:p></o:p>
<o:p> </o:p>Format-Table 命令假定离属性列表开头越近的属性的重要性越高。因此,它会试图完全显示最靠近开头的属性。如果 Format-Table 命令无法显示所有属性,则会从显示中删除部分列并发出相应警告。如果将 Name 作为列表中的最后一个属性,则会看到此类行为:
PS> Get-Process -Name   powershell | Format-Table -Property Company,Path,Id,Name -<o:p></o:p>
AutoSize<o:p></o:p>
<o:p> </o:p>
警告: 列“Name”无法显示,已被删除。<o:p></o:p>
<o:p> </o:p>
Company               Path                                                      I<o:p></o:p>
d<o:p></o:p>
-------               ----                                                      -<o:p></o:p>
Microsoft Corporation   C:\Program Files\Windows PowerShell\v1.0\powershell.exe 6<o:p></o:p>
<o:p> </o:p>在以上输出中,ID 列被截断以便能容纳在列表中,并且堆叠了列标题。自动调整各列大小,并不一定总会实现您需要的效果。
Format-Table 输出在列中换行 (Wrap)<o:p></o:p>
通过使用 Wrap 参数,可以将冗长的 Format-Table 数据强行在其显示列中换行。单独使用 Wrap 参数不一定能实现您的预期效果,这是因为如果不同时指定 AutoSize,则会使用默认设置:
PS> Get-Process -Name   powershell | Format-Table -Wrap -Property Name,Id,Company,<o:p></o:p>
Path<o:p></o:p>
<o:p> </o:p>
Name                                 Id   Company             Path<o:p></o:p>
----                                 --   -------             ----<o:p></o:p>
powershell                         2836 Microsoft   Corporati C:\Program Files\Wi<o:p></o:p>
on                  ndows PowerShell\v1<o:p></o:p>
.0\powershell.exe <o:p></o:p>
<o:p> </o:p>单独使用 Wrap 参数的一个优点在于它不会极大降低处理速度。如果在执行大型目录系统的递归文件列表时使用 AutoSize,则在显示第一个输出项之前可能需要花费很长时间并占用大量内存。
如果不考虑系统负载,则将 AutoSizeWrap 参数一起使用会取得不错的效果。与指定 AutoSize 而不指定 Wrap 参数时的情况一样,始终会为初始列分配所需的宽度以便在一行内显示项目。唯一的不同之处在于:如有必要,最后一列将进行换行:
PS> Get-Process -Name   powershell | Format-Table -Wrap -AutoSize -Property Name,I<o:p></o:p>
d,Company,Path<o:p></o:p>
<o:p> </o:p>
Name         Id Company               Path<o:p></o:p>
----         -- -------               ----<o:p></o:p>
powershell 2836 Microsoft   Corporation C:\Program Files\Windows PowerShell\v1.0\<o:p></o:p>
powershell.exe<o:p></o:p>
<o:p> </o:p>如果先指定最宽的列,则可能无法显示某些列,因此,最安全的做法是先指定最小的数据元素。在以下示例中,我们先指定最宽的路径元素,在这种情况下,即使通过换行也仍然无法显示最后的 Name 列:
PS> Get-Process -Name   powershell | Format-Table -Wrap -AutoSize -Property Path,I<o:p></o:p>
d,Company,Name<o:p></o:p>
<o:p> </o:p>
警告: 列“Name”无法显示,已被删除。<o:p></o:p>
<o:p> </o:p>
Path                                                        Id Company<o:p></o:p>
----                                                        -- -------<o:p></o:p>
C:\Program Files\Windows   PowerShell\v1.0\powershell.exe 2836 Microsoft Corporat<o:p></o:p>
ion<o:p></o:p>
<o:p> </o:p>组织表输出 (-GroupBy)<o:p></o:p>
用于表格格式输出控制的另一个有用参数是 GroupBy。越长的表格格式列表可能越难以进行比较。使用 GroupBy 参数可以基于属性值对输出进行分组。例如,我们可以按公司对进程进行分组,从而忽略属性列表中的公司值来更轻松地进行检查:
PS> Get-Process -Name   powershell | Format-Table -Wrap -AutoSize -Property Name,I<o:p></o:p>
d,Path -GroupBy Company<o:p></o:p>
<o:p> </o:p>
<o:p> </o:p>
Company           :Microsoft Corporation<o:p></o:p>
<o:p> </o:p>
Name         Id Path<o:p></o:p>
----         -- ----<o:p></o:p>
powershell 1956 C:\Program   Files\Windows PowerShell\v1.0\powershell.exe<o:p></o:p>
powershell 2656 C:\Program   Files\Windows PowerShell\v1.0\powershell.exe<o:p></o:p>
 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-379198-1-1.html 上篇帖子: PowerShell 2.0 实践(一)操作文件系统 . 下篇帖子: PowerShell基础教程(12)——处理对象
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表