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

[玩转系统] 告诉 PowerShell 你想要什么

作者:精品下载站 日期:2024-12-14 08:05:42 浏览:13 分类:玩电脑

告诉 PowerShell 你想要什么


前几天我在 Twitter 上看到一个关于如何在运行 Get-VM Hyper-V cmdlet 时包含 Notes 属性的问题。我正在阅读字里行间的内容,但我认为期望的目标是包含 Notes 属性。您可以通过以下几种方法来解决此问题。即使您不使用 Hyper-V,如果您需要自定义不同 PowerShell 命令的输出,这些概念也同样有效。

PowerShell 完全是关于对象的,这是一件好事。对我们来说幸运的是,PowerShell 团队提前计划并没有创建发出固定对象的命令。他们为我们提供了定制输出以满足我们需求的工具。这里就是这种情况。

在 PowerShell 中运行 cmdlet(尤其是来自 Microsoft 的 cmdlet)时,通常会得到易于阅读的结果。当开发命令时,有人决定显示什么信息以及如何显示它。许多命令(例如 Get-VM)将丰富的对象写入管道。但是,您只能看到该信息的一部分。使用 Select-Object 可以轻松查看所有可用属性。

[玩转系统] 告诉 PowerShell 你想要什么

如果我想查看某些内容,我所要做的就是告诉 PowerShell 将其显示给我。

Get-VM | Where-Object state -EQ running | 
Select-Object -Property Name, State, Version, Uptime, AutomaticStartAction, Notes

[玩转系统] 告诉 PowerShell 你想要什么

但假设我想经常获得这些属性。不断重新输入 Select-Object 语句会变得非常乏味。这是一种选择。

属性集

PowerShell 有属性集的概念。属性集允许您使用单个属性名称来检索一组属性。其中一些集合是默认定义的。要亲自查看,请运行此命令。

Get-Process | Select-Object PSResources

您将获得一组相关属性。对于虚拟机,最好有一个包含 Notes 属性的属性集。但有一个小问题。您可以使用 Update-TypeData 来扩展对象。但属性集需要特殊格式的 ps1xml 文件。不要恐慌。我掩护你。

从 PowerShell 库安装 PSTypeExtensionTools 模块。我已经编写了一个命令来为您生成 XML 文件。

$splat = @{
    Typename   = 'Microsoft.HyperV.PowerShell.VirtualMachine'
    Name       = 'MgmtInfo'
    FilePath   = 'C:\scripts\mgmtinfo.types.ps1xml'
    Properties = 'Name', 'State', 'Version', 'Uptime', 'AutomaticStartAction', 'Notes'
}
New-PSPropertySet @splat

Typename 值是您在通过管道将对象传递给 Get-Member 时看到的值。名称值将是新属性集的名称。该路径是不言自明的。典型的命名约定是objectType.types.ps1xml。我稍微偏离了一点。当然,属性是新集合的成员。

运行此命令会生成此 XML 文件。

<?xml version="1.0" encoding="utf-8"?>
<!--
This file was created with New-PSPropertySet from the
PSTypeExtensionTools module which you can install from
the PowerShell Gallery.

Use Update-TypeData to append this file in your PowerShell session.

Created 01/18/2022 08:33:05
-->
<Types>
  <Type>
    <Name>Microsoft.HyperV.PowerShell.VirtualMachine</Name>
    <Members>
      <PropertySet>
        <Name>MgmtInfo</Name>
        <ReferencedProperties>
          <Name>Name</Name>
          <Name>State</Name>
          <Name>Version</Name>
          <Name>Uptime</Name>
          <Name>AutomaticStartAction</Name>
          <Name>Notes</Name>
        </ReferencedProperties>
      </PropertySet>
    </Members>
  </Type>
</Types>

要在我的 PowerShell 会话中使用它,我需要导入它。

Update-TypeData -AppendPath $splat.FilePath

我现在拥有一处新房产。

[玩转系统] 告诉 PowerShell 你想要什么

您必须将显示内容的想法与如何显示它的想法分开。格式化是一项单独的任务。

[玩转系统] 告诉 PowerShell 你想要什么

该属性集与任何其他属性没有什么不同。我可以轻松地运行这样的命令:

Get-VM | Where-Object state -EQ running | 
Select-Object -Property MgmtInfo | Out-GridView


顺便说一下,此属性集仅在我的 PowerShell 会话期间定义。如果这是我一直想要的,我会将 Update-TypeData 命令添加到我的 PowerShell 配置文件脚本中。

更改默认值

从技术上讲,您可以使用 Update-TypeData 更改默认属性集。使用 Get-TypeData 来发现。

[玩转系统] 告诉 PowerShell 你想要什么

但是,此默认属性列表并不一定意味着这就是您所看到的。

[玩转系统] 告诉 PowerShell 你想要什么

Get-VM 的默认输出是格式化表。看到显示内容和显示方式之间的区别了吗?

我可以很容易地更新 DefaultDisplayPropertySet。

[玩转系统] 告诉 PowerShell 你想要什么

默认表视图没有 Notes 属性的定义,因此我看不到它。但我也可以解决这个问题。

自定义格式文件

我已经多次写过这个步骤。最简单的步骤是使用 PSScriptTools 模块中的 New-PSFormatXML 命令创建自定义格式化视图。我假设所需的结果是添加了 Notes 属性的当前视图。

要使用该命令,您需要一个示例对象,其中包含要使用的所有属性的值。

$splat = @{
 Path = 'c:\scripts\vmnotes.format.ps1xml' 
 ViewName = 'notes'
 Wrap = $true
 Properties = 'Name','State','CpuUsage','MemoryAssigned',
 'Uptime',@{Name='Version';Expression={$_.status}},'Notes'
}

Get-VM dom1 | New-PSFormatXML @splat

我将创建一个名为“notes”的新表视图。我要指出的是,在撰写本文时,我发现了 New-PSFormatXML 中的一个小错误。如果运行此代码,您可能会收到一条错误消息,指出 CpuUsage 是只读属性。这不会影响结果,您可以忽略该错误。我稍后必须研究一下这个问题。

与 ps1xml 文件类型一样,您需要更新 PowerShell 才能使用新格式。

Update-FormatData $splat.path

[玩转系统] 告诉 PowerShell 你想要什么

您会注意到有些数据有点原始,例如 MemoryAssigned 值。 XML 文件中的注释向您展示了如何自定义和格式化输出。

概括

在扩展 PowerShell 时,您可以采取多种方法。最终取决于您打算如何使用信息。您是否需要自定义属性集来简化您的 PowerShell 命令?或者您是否需要包含所需信息的格式化结果?希望这能让我的朋友走上正轨。

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

取消回复欢迎 发表评论:

关灯