当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 你是我喜欢的类型吗?

作者:精品下载站 日期:2024-12-14 07:51:40 浏览:13 分类:玩电脑

你是我喜欢的类型吗?


我总是强调 PowerShell 是关于对象的。如果您记住这一点,PowerShell 就非常容易使用。获取一堆内容,然后选择您想要查看或使用的详细信息。开箱即用的 PowerShell 为您提供了一些非常丰富的对象,从简单的文件到 Active Directory 用户。我更喜欢的是,您可以“即时”创建自己的属性来满足的需求。这几乎就像魔法一样。您几乎可以凭空创建新属性。但有时这个过程也会变得有点乏味或令人难以承受。让我提供一些解决方案。

让我们开始运行一个 PowerShell 表达式来发现当前正在运行的系统驱动程序。

Get-CimInstance -class win32_systemdriver -filter "state='running'" |
Select-Object Name,Description,ServiceType,StartMode,@{Name="Path";Expression={$_.pathname}},
@{Name="Company";Expression = {(get-item $_.pathname).versioninfo.CompanyName}},
@{Name="Product";Expression = {(get-item $_.pathname).versioninfo.ProductName}},
@{Name="Version";Expression = {(get-item $_.pathname).versioninfo.productversion}},
@{Name="Updated";Expression = {(get-item $_.pathname).lastwritetime}},
@{Name="Computername";Expression={$_.SystemName}}

[玩转系统] 你是我喜欢的类型吗?

虽然有效,但这需要大量打字。通过 Select-Object,我使用哈希表创建了一些别名属性。例如,我不想使用“系统名称”,而是想显示“计算机名称”。我还想包含不属于 Win32_SystemDriver 对象一部分的信息。该对象确实包含文件路径的属性,因此我创建了一些自定义属性来从文件中检索版本信息。

@{Name="Company";Expression = {(get-item $_.pathname).versioninfo.CompanyName}},
@{Name="Product";Expression = {(get-item $_.pathname).versioninfo.ProductName}},
@{Name="Version";Expression = {(get-item $_.pathname).versioninfo.productversion}}

挑战在于,如果我想使用不同的过滤器或不同的属性子集重新运行命令,我必须重新键入大量代码。我敢打赌你不喜欢打字。让我们看看一些选项。

首先,您可以将自定义属性定义保存为变量。

$path = @{Name="Path";Expression={$_.pathname}}
$company = @{Name="Company";Expression = {(get-item $_.pathname).versioninfo.CompanyName}}

我可以在我的 Select-Object 语句中使用这些变量。

Get-CimInstance -class win32_systemdriver -filter "state='running'" | 
Select-Object Name,Description,StartMode,$path,$company  | Group Company

[玩转系统] 你是我喜欢的类型吗?

只要定义了这些变量,我就可以随意使用它们。

但也许最好的方法是创建您自己的类型扩展。在你以为我要求你创建一个看起来很神秘的 xml 文件之前,这实际上非常简单。首先,您需要要扩展的对象的类型名。每次使用 Get-Member 时都会看到这一点。

[玩转系统] 你是我喜欢的类型吗?

我将用一行代码保存这个值。

$type = get-ciminstance win32_systemdriver | select-object -first 1 | Get-member | Select-object -ExpandProperty TypeName

这个变量很可能是一个名称数组,所以我将使用 $type[0]

[玩转系统] 你是我喜欢的类型吗?

接下来,我将使用 Update-TypeData cmdlet。是的,您可以使用 ps1xml 文件,但并非必须如此。我可以轻松创建我的别名属性。

Update-TypeData -TypeName $type[0] -MemberType AliasProperty -MemberName Path -Value pathname -force
Update-TypeData -TypeName $type[0] -MemberType AliasProperty -MemberName Computername -Value SystemName -force

Value 是实际属性的名称。我正在使用 -Force 覆盖任何现有的属性定义。我还可以创建 ScriptProperties,它将运行一小段代码来获取值。

Update-TypeData -TypeName $type[0] -MemberType ScriptProperty -MemberName Company -Value {(get-item $this.pathname).versioninfo.CompanyName} -force
Update-TypeData -TypeName $type[0] -MemberType ScriptProperty -MemberName "Product" -Value {(get-item $this.pathname).versioninfo.ProductName} -force
Update-TypeData -TypeName $type[0] -MemberType ScriptProperty -MemberName "Version" -Value {(get-item $this.pathname).versioninfo.productversion} -force
Update-TypeData -TypeName $type[0] -MemberType ScriptProperty -MemberName "Updated" -Value {(get-item $this.pathname).lastwritetime} -force

该值是我之前定义的表达式键的脚本块部分。您必须记住进行的唯一其他更改是使用 $this 而不是 $_。

现在,这些属性是为任何 Win32_SystemDriver 对象定义的。

Get-CimInstance Win32_SystemDriver -filter "state='running'"  | 
Select-Object Name,Description,ServiceType,StartMode,Path,Company,Product,Version,Updated,Computername |
Out-Gridview -title "Running Drivers"

[玩转系统] 你是我喜欢的类型吗?

看看这有多容易和清洁吗?我可以随心所欲地使用这些属性。

Get-CimInstance Win32_SystemDriver -filter "servicetype='kernel driver'"  |
Where Company -notmatch "microsoft" | Sort StartMode,Name |
Format-Table -GroupBy StartMode -Property State,Name,Company

但是,请记住,这些是*您的*属性,而不是 WMI 的一部分,这就是为什么我无法在 Get-CimInstance 过滤器中使用它们。

[玩转系统] 你是我喜欢的类型吗?

关于此技术的一些最后注意事项。这些扩展仅在我的 PowerShell 会话运行期间持续有效。如果我总是想要拥有它们,我会将此代码放入我的 PowerShell 配置文件脚本中。编写使用这些扩展的脚本或模块时还应该小心。如果有人正在运行您的代码并且他们没有添加类型扩展,则代码将无法工作。在模块中,您可以将 Update-TypeData 行添加到 .psm1 文件中。或者,您可以采取额外的步骤来创建带有扩展名的实际 .ps1xml 文件,并将其包含在您的模块中。

试一下我的代码示例并让我知道您的想法。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯