[玩转系统] PowerShell 格式化文件的简单方法
作者:精品下载站 日期:2024-12-14 07:54:38 浏览:15 分类:玩电脑
PowerShell 格式化文件的简单方法
每当我教授或演示 PowerShell 脚本编写时,我总是谈论将对象写入管道。大多数时候,您只需让 PowerShell 尽可能格式化并显示命令的输出即可。但是,您可能希望亲自处理并创建自定义输出。例如,当您运行 Get-Process PowerShell 时,会显示一个格式化的表。但您知道,显示的内容不一定是您使用 Get-Member 看到的底层对象。 PowerShell 定义了 Process 对象的默认视图。您可以使用命令执行相同的操作。
创建自定义输出
这是一个相对简单的脚本,它将自定义对象写入管道,该对象具有派生自多个 WMI 类的属性。
Function Get-SysInfo {
[cmdletbinding()]
Param(
[Parameter(Position = 0, ValueFromPipeline)]
[ValidateNotNullorEmpty()]
[string]$Computername = $env:computername,
[PSCredential]$Credential
)
Begin {
$cimParams = @{
Classname = ""
CimSession = ""
Property = "*"
ErrorAction = "stop"
}
}
Process {
Try {
$sess = New-CimSession @PSBoundParameters
$cimParams.cimSession = $sess
}
Catch {
Throw $_
}
$cimParams.Classname = "Win32_Operatingsystem"
$cimParams.Property = "CSName", "Caption","Version"
Try {
$os = Get-CimInstance @cimParams
}
Catch {
Throw $_
}
$cimParams.Classname = "Win32_Computersystem"
$cimParams.Property = "Manufacturer", "Model"
$cs = Get-CimInstance @cimParams
$cimParams.Classname = "Win32_Process"
$cimParams.Property = "Name"
$procs = Get-CimInstance @cimParams
$cimParams.Classname = "Win32_Service"
$cimParams.Filter = "State = 'running'"
$running = Get-Ciminstance @cimParams
[PSCustomobject]@{
PSTypeName = "mySysInfo"
Computername = $os.CSName
OS = $os.Caption
Version = $os.Version
System = ("{0} {1}" -f $cs.Manufacturer.Trim(), $cs.Model.Trim())
Services = $Running.Count
Processes = $Procs.count
}
$cimParams.remove("filter")
Remove-CimSession $sess
} #close Process
End {
#not used
}
} #close function
我将自定义类型名称定义为自定义对象的一部分。
假设我更喜欢默认输出为表格而不是列表。这将需要存储在 format.ps1xml 文件中的表定义。创建这些文件可能很棘手。我曾经在现有文件(例如 $PSHome\DotnetTypes.format.ps1xml)中查找某些内容,并将其复制到一个新文件中,然后更新该文件。但现在我有一个更好的解决方案。
新PSFormatXML
我的 PSScriptTools 模块(可以从 PowerShell 库安装)现在包含一个名为 New-PSFormatXML 的命令。该命令旨在分析对象并默认创建所有属性的表视图,尽管您可以指定要包含哪些属性。 format.ps1xml 文件将自动调整表格大小,但您可以删除该指令并使用最佳猜测的宽度。定义新视图时需要进行一些尝试和错误。
创建新文件就像这样简单:
Get-SysInfo | New-PSFormatXML -Path .\mySysInfo.format.ps1xml
您只需要一个对象的单个实例。您可以通过管道将多个对象传递给 New-PSFormatXML,但后续对象将被忽略。该命令将生成一个如下所示的 xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<!--
format type data generated 02/18/2019 12:19:49
by BOVINE320\Jeff
-->
<Configuration>
<ViewDefinitions>
<View>
<!--Created 02/18/2019 12:19:49 by BOVINE320\Jeff-->
<Name>default</Name>
<ViewSelectedBy>
<TypeName>mySysInfo</TypeName>
</ViewSelectedBy>
<TableControl>
<!--Delete the AutoSize node if you want to use the defined widths.-->
<AutoSize />
<TableHeaders>
<TableColumnHeader>
<Label>Computername</Label>
<Width>15</Width>
<Alignment>left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>OS</Label>
<Width>27</Width>
<Alignment>left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>Version</Label>
<Width>13</Width>
<Alignment>left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>System</Label>
<Width>20</Width>
<Alignment>left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>Services</Label>
<Width>11</Width>
<Alignment>left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>Processes</Label>
<Width>12</Width>
<Alignment>left</Alignment>
</TableColumnHeader>
</TableHeaders>
<TableRowEntries>
<TableRowEntry>
<TableColumnItems>
<!--
By default the entries use property names, but you can replace them with scriptblocks.
<Scriptblock>$_.foo /1mb -as [int]</Scriptblock>
-->
<TableColumnItem>
<PropertyName>Computername</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>OS</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>Version</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>System</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>Services</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>Processes</PropertyName>
</TableColumnItem>
</TableColumnItems>
</TableRowEntry>
</TableRowEntries>
</TableControl>
</View>
</ViewDefinitions>
</Configuration>
从这里我可以根据需要编辑文件。但由于我很乐意在表中显示所有属性,因此我将使用此信息更新 PowerShell。
Update-FormatData -AppendPath .\mySysInfo.format.ps1xml
现在,当我运行我的函数时,默认情况下会显示一个表格。
添加更多视图
我还可以创建其他视图。
Get-SysInfo | New-PSFormatXML -Path .\mySysInfo.format.ps1xml -Properties "Computername","OS","Version" -ViewName OS -Append
我再次修改视图,甚至添加自定义属性。这是我修改后的格式文件。
<?xml version="1.0" encoding="UTF-8"?>
<!--
format type data generated 02/18/2019 12:30:50
by BOVINE320\Jeff
-->
<Configuration>
<ViewDefinitions>
<View>
<!--Created 02/18/2019 12:30:50 by BOVINE320\Jeff-->
<Name>default</Name>
<ViewSelectedBy>
<TypeName>mySysInfo</TypeName>
</ViewSelectedBy>
<TableControl>
<!--Delete the AutoSize node if you want to use the defined widths.-->
<AutoSize />
<TableHeaders>
<TableColumnHeader>
<Label>Computername</Label>
<Width>15</Width>
<Alignment>left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>OS</Label>
<Width>27</Width>
<Alignment>left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>Version</Label>
<Width>13</Width>
<Alignment>left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>System</Label>
<Width>20</Width>
<Alignment>left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>Services</Label>
<Width>11</Width>
<Alignment>left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>Processes</Label>
<Width>12</Width>
<Alignment>left</Alignment>
</TableColumnHeader>
</TableHeaders>
<TableRowEntries>
<TableRowEntry>
<TableColumnItems>
<!--
By default the entries use property names, but you can replace them with scriptblocks.
<Scriptblock>$_.foo /1mb -as [int]</Scriptblock>
-->
<TableColumnItem>
<PropertyName>Computername</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>OS</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>Version</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>System</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>Services</PropertyName>
</TableColumnItem>
<TableColumnItem>
<PropertyName>Processes</PropertyName>
</TableColumnItem>
</TableColumnItems>
</TableRowEntry>
</TableRowEntries>
</TableControl>
</View>
<View>
<!--Created 02/18/2019 12:31:00 by BOVINE320\Jeff-->
<Name>OS</Name>
<ViewSelectedBy>
<TypeName>mySysInfo</TypeName>
</ViewSelectedBy>
<TableControl>
<TableHeaders>
<TableColumnHeader>
<Label>Computername</Label>
<Width>15</Width>
<Alignment>left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>OS</Label>
<Width>40</Width>
<Alignment>left</Alignment>
</TableColumnHeader>
<TableColumnHeader>
<Label>Version</Label>
<Width>13</Width>
<Alignment>right</Alignment>
</TableColumnHeader>
</TableHeaders>
<TableRowEntries>
<TableRowEntry>
<TableColumnItems>
<!--
By default the entries use property names, but you can replace them with scriptblocks.
<Scriptblock>$_.foo /1mb -as [int]</Scriptblock>
-->
<TableColumnItem>
<PropertyName>Computername</PropertyName>
</TableColumnItem>
<TableColumnItem>
<Scriptblock>$($_.OS -replace "^Microsoft","").trim()</Scriptblock>
</TableColumnItem>
<TableColumnItem>
<PropertyName>Version</PropertyName>
</TableColumnItem>
</TableColumnItems>
</TableRowEntry>
</TableRowEntries>
</TableControl>
</View>
</ViewDefinitions>
</Configuration>
在此视图中,我使用脚本块来定义从名称中删除“Microsoft”的操作系统属性。要使用,我更新格式数据并将命令通过管道传输到指定视图名称的 Format-Table。
让它变得漂亮
现在,您的函数没有理由没有漂亮的或至少有意义的输出。如果您将自定义对象写入管道,只要定义类型名,现在创建格式化指令应该更容易。在模块清单中,在 FormatsToProcess 部分中指定 format.ps1xml 文件。
我希望您发现这是对您的 PowerShell 工具箱的有用补充。我知道这是我现在在工作中会一直使用的东西。
猜你还喜欢
- 03-30 [玩转系统] 如何用批处理实现关机,注销,重启和锁定计算机
- 02-14 [系统故障] Win10下报错:该文件没有与之关联的应用来执行该操作
- 01-07 [系统问题] Win10--解决锁屏后会断网的问题
- 01-02 [系统技巧] Windows系统如何关闭防火墙保姆式教程,超详细
- 12-15 [玩转系统] 如何在 Windows 10 和 11 上允许多个 RDP 会话
- 12-15 [玩转系统] 查找 Exchange/Microsoft 365 中不活动(未使用)的通讯组列表
- 12-15 [玩转系统] 如何在 Windows 上安装远程服务器管理工具 (RSAT)
- 12-15 [玩转系统] 如何在 Windows 上重置组策略设置
- 12-15 [玩转系统] 如何获取计算机上的本地管理员列表?
- 12-15 [玩转系统] 在 Visual Studio Code 中连接到 MS SQL Server 数据库
- 12-15 [玩转系统] 如何降级 Windows Server 版本或许可证
- 12-15 [玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[影视] 黑道中人 Alto Knights(2025)剧情 犯罪 历史 电影
[古装剧] [七侠五义][全75集][WEB-MP4/76G][国语无字][1080P][焦恩俊经典]
[实用软件] 虚拟手机号 电话 验证码 注册
[电视剧] 安眠书店/你 第五季 You Season 5 (2025) 【全10集】
[电视剧] 棋士(2025) 4K 1080P【全22集】悬疑 犯罪 王宝强 陈明昊
[软件合集] 25年6月5日 精选软件22个
[软件合集] 25年6月4日 精选软件36个
[短剧] 2025年06月04日 精选+付费短剧推荐33部
[短剧] 2025年06月03日 精选+付费短剧推荐25部
[软件合集] 25年6月3日 精选软件44个
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电视剧] 欢乐颂.5部全 (2016-2024)
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[影视] 【稀有资源】香港老片 艺坛照妖镜之96应召名册 (1996)
[剧集] 神经风云(2023)(完结).4K
[剧集] [BT] [TVB] [黑夜彩虹(2003)] [全21集] [粤语中字] [TV-RMVB]
[实用软件] 虚拟手机号 电话 验证码 注册
[资源] B站充电视频合集,包含多位重量级up主,全是大佬真金白银买来的~【99GB】
[影视] 内地绝版高清录像带 [mpg]
[书籍] 古今奇书禁书三教九流资料大合集 猎奇必备珍藏资源PDF版 1.14G
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电影] 美国队长4 4K原盘REMUX 杜比视界 内封简繁英双语字幕 49G
[电影] 死神来了(1-6)大合集!
[软件合集] 25年05月13日 精选软件16个
[精品软件] 25年05月15日 精选软件18个
[绝版资源] 南与北 第1-2季 合集 North and South (1985) /美国/豆瓣: 8.8[1080P][中文字幕]
[软件] 25年05月14日 精选软件57个
[短剧] 2025年05月14日 精选+付费短剧推荐39部
[短剧] 2025年05月15日 精选+付费短剧推荐36部
- 最新评论
-
- 热门tag