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

[玩转系统] PowerShell 初学者(第 10 部分):过滤和Where-Object

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

PowerShell 初学者(第 10 部分):过滤和Where-Object


我们已经了解了很多有关 PowerShell 的知识。上次我们使用 WMI:PowerShell 初学者(第 9 部分):使用 PowerShell 和 WMI 从 Windows 获取一切 现在,在我看来,现在是关注“使用 PowerShell 进行过滤”主题的最佳时机。但首先,让我们看一下上一部分的练习。

该系列的所有部分都可以在这里找到:PowerShell 初学者(系列)

回顾(第 9 部分)

这是第 9 部分的作业和解决方案:

检索有关硬盘的信息。使用 Get-WmiObject 或 Get-CimInstance。首先,搜索 WMI 对象,找到后会显示名称、分区、型号、固件和序列号。

首先,我们需要找出 WMI 实例名称。由于任务涉及硬盘,因此我们可以搜索 *disk*,例如。


Get-WmiObject *disk* -List

[玩转系统] PowerShell 初学者(第 10 部分):过滤和Where-Object

Win32_DiskDrive 听起来不错。请记住第 8 部分中的两步方法,以充分利用 PowerShell:


Get-CimInstance win32_diskdrive | Get-Member

在那里您会找到适当的属性。现在使用 Select-Object 来获取所有这些。


Get-CimInstance Win32_DiskDrive | Select-Object Name,Partitions, Size,Model,FirmwareRevision,SerialNumber

[玩转系统] PowerShell 初学者(第 10 部分):过滤和Where-Object

审查


WMI(Windows 管理工具)提供对几乎所有 Windows 设置的读写访问权限。有两个重要的 cmdlet:Get-WmiObject 和 Get-CimInstance。


为什么要过滤?

过滤是PowerShell中的一项关键技术。一旦了解如何过滤,您就能从 PowerShell 中获得更多收益。

好吧,我这部分的任务是解释为什么过滤很重要。好吧,假设您有多个硬盘。上面的输出显示了所有硬盘。但例如,您只想显示三星硬盘。

[玩转系统] PowerShell 初学者(第 10 部分):过滤和Where-Object

你为什么想做这个?也许您的老板问您正在使用多少个三星磁盘。在所有计算机上。请记住,WMI 和 PowerShell 使您能够执行远程查询。好吧回到主题。我们只想要 500 GB 的三星 SSD。注意过滤参数!


Get-CimInstance Win32_DiskDrive -Filter "Model='Samsung SSD 850 EVO 500GB'" | Select-Object Name,Partitions, Size,Model,FirmwareRevision,SerialNumber

[玩转系统] PowerShell 初学者(第 10 部分):过滤和Where-Object

以下内容有点不同寻常,适合更高级的 PowerShell 书呆子,但为什么不呢?以下命令从所有域计算机获取所有三星 SSD,但不从服务器获取。


Get-CimInstance Win32_DiskDrive -Filter "Model='Samsung SSD 850 EVO 500GB'" -ComputerName (Get-ADComputer -Filter {operatingsystem -notlike '*server*'}).Name | Select-Object Name,Partitions, Size,Model,FirmwareRevision,SerialNumber

如果您的同事认为您面临无法解决的问题,只需按下按钮并向他们展示您可以做什么。 ?

好吧,让我们来看初学者的例子。

过滤对象

您还记得 Get-ChildItem 命令吗?我在本系列中经常使用这个命令。

如果您运行 Get-Help Get-ChildItem 您会在帮助中找到很多过滤示例。


Get-Help Get-ChildItem -Online

我更喜欢使用本地帮助。


Get-Help Get-ChildItem -Examples

[玩转系统] PowerShell 初学者(第 10 部分):过滤和Where-Object

到目前为止我们学到了什么?


过滤是 PowerShell 中的一项关键技术。一旦了解了如何过滤,您就会从 PowerShell 中获得更多收益。


过滤 Active Directory 对象

如果您是 IT 专业人员,您可能在 Active Directory 环境中工作。过滤是使用 Active Directory 对象时的一项关键技术。

以下命令使用 Filter 参数来获取所有被禁用的用户:


Get-ADUser -Filter {enabled -eq 'false'} | Select-Object Name

[玩转系统] PowerShell 初学者(第 10 部分):过滤和Where-Object

您可能想知道我如何知道属性名称?请记住从对象中获取更多信息的两步方法: 1. 使用 Get-Member 2. 使用 Select-Object。

[玩转系统] PowerShell 初学者(第 10 部分):过滤和Where-Object

过滤器参数

让我们环顾四周。哪些命令使用过滤器参数?请注意,我在域控制器上。


Get-Command -ParameterName Filter

正如您所看到的,过滤器参数主要用于 Active Directory 命令中。而且我必须承认,我一直只对 Active Directory 使用过滤器参数。它就是这样儿的。那么,让我们集中讨论 Active Directory。假设我们希望所有域计算机(服务器操作系统和客户端操作系统)按操作系统排序。为此,我们必须使用带有 * 的过滤器参数。


Get-ADComputer -Filter * -Properties Name,Operatingsystem,OperatingSystemVersion,IPv4Address | Sort-Object OperatingSystem | Select-Object Name,OperatingSystem

[玩转系统] PowerShell 初学者(第 10 部分):过滤和Where-Object

就过滤而言,这是一项简单的任务。

过滤方法

现在我们尝试获取所有安装了 Windows 10 的计算机。为此,我们必须将过滤器参数放在括号中。


Get-ADComputer -Filter {operatingsystem -like '*windows 10*'}

是时候分解细节了。

括号

将过滤器放入弯曲支架中。

[玩转系统] PowerShell 初学者(第 10 部分):过滤和Where-Object

属性

接下来找出属性(属性)名称。我们已经在 PowerShell 初学者(第 8 部分)中讨论过它:PowerShell 的力量 - 接触对象(获取成员、选择对象)。记住两步法!

[玩转系统] PowerShell 初学者(第 10 部分):过滤和Where-Object


Get-ADComputer client01 -Properties * | Get-Member

[玩转系统] PowerShell 初学者(第 10 部分):过滤和Where-Object

旁注:注意属性参数。在 Active Directory 中,默认情况下并不显示所有属性。

经营者

接下来使用运算符。

[玩转系统] PowerShell 初学者(第 10 部分):过滤和Where-Object

运算符可以是 -like、-as、-equal、-ne 等等……有关参数类型的更多信息


help about_operators

这将打开存储在您的计算机上的文本文件。

该声明

如果我们想要过滤某些东西,我们需要一个条件。该条件必须放在引号中。

[玩转系统] PowerShell 初学者(第 10 部分):过滤和Where-Object

审查


如果您使用过滤器,请先参阅“帮助”部分。过滤器通常放在括号中。通常还使用运算符。


更多过滤器示例……无需多言……

搜索密码错误计数为 0 的用户。以下是 Petra 帐户的示例:

[玩转系统] PowerShell 初学者(第 10 部分):过滤和Where-Object


Get-ADUser -Filter {badpwdcount -eq '0'} | Select-Object Name

[玩转系统] PowerShell 初学者(第 10 部分):过滤和Where-Object

搜索错误密码计数为 0 且已启用的用户。 (您会看到 Petra 未启用)。


Get-ADUser -Filter {(badpwdcount -eq '0') -and (enabled -eq 'true')} | Select-Object Name

[玩转系统] PowerShell 初学者(第 10 部分):过滤和Where-Object

显示所有 Windows Server 域计算机,但仅显示运行 Windows Server 2016 且名称以 DC 开头的计算机。


Get-ADComputer -Filter {(operatingsystem -like '*2016*') -and (name -like 'dc*')}

[玩转系统] PowerShell 初学者(第 10 部分):过滤和Where-Object

但有时我们必须寻找另一种方式。即当没有可用的过滤时。然后我们使用Where-Object。

使用Where-Object 进行过滤

Where-Object 始终位于管道的右侧。左侧筛选。这意味着什么,帖子末尾的优点和缺点。对于这一部分,我们将集中讨论Where-Object。

以下是 PowerShell 帮助中的一些示例。


Get-Process | Where-Object {$_.handles -gt 200 -and $_.name -eq "svchost"}


Get-ChildItem c:\scripts | Where-Object {$_.length -gt 100000}

但是,我想使用我的贡献之一中的示例。


Get-Hotfix | Where-Object HotfixID -like KB31*

[玩转系统] PowerShell 初学者(第 10 部分):过滤和Where-Object

注意HotFixID。它指的是一个属性。

推荐的过程(因为向后兼容性)如下所示:


Get-Hotfix | Where-Object {$_.HotfixID -like 'KB31*'}

[玩转系统] PowerShell 初学者(第 10 部分):过滤和Where-Object

现在有新的东西了。 $_ 是什么意思?

$_ 是一个变量,它迭代从前一个(管道)传递的每个对象/元素。简单地说:从管道中的每个对象中获取 hotfixID。

过滤与Where-Object

如果没有可用的过滤器,请使用Where-Object。如果您能够在管道左侧使用过滤器,请使用它!为什么?嗯,无论是通过管道发送 1000 个对象还是仅发送 500 个对象,这都是有区别的,在Where-Object 的情况下,所有对象都必须通过管道,然后才会被过滤。记住第 7 部分中的管道:适用于初学者的 PowerShell(第 7 部分):管道(以及许多可供使用的示例)

审查


Where-Object 始终位于管道的右侧。左侧筛选。如果您可以选择管道左侧的过滤器或右侧的Where-Object,请选择左侧。


锻炼

这是下一部分的练习。

对象位置:

使用 Get-Service 和Where-Object 仅显示正在运行的服务。

过滤器(需要 Active Directory):

使用 Filter 参数获取所有被禁用的用户。

下次主题再见:PowerShell 初学者(第 11 部分):享受 PowerShell 驱动器的乐趣

Patrick Gruenauer,PowerShell MVP

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

取消回复欢迎 发表评论:

关灯