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

[玩转系统] 使用 PowerShell 管道高效工作

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

使用 PowerShell 管道高效工作


[玩转系统] 使用 PowerShell 管道高效工作

您对管道有多熟悉?我们正在推出一个新的简短系列 -,从 PowerShell 管道基础知识主题开始。

简介 - 不要害怕管道!

对于许多管理员来说,PowerShell 中的管道功能似乎是一个他们经常绕过的未知领域,尽管它具有巨大的潜力。即使至少了解了基础知识,许多人也不愿意独立使用它,而是主要依赖于复制的代码。事实上,该应用程序在实践中并不像通常想象的那么复杂,并且在熟悉它后很短的时间后它几乎变得直观。

管道使多个 CMDlet 能够无缝链接,这意味着即使是复杂的任务也可以得到简化。本文回答了以下问题:

  • 管道的基础知识和基本功能是什么?
  • 如何使用管道单独过滤和排序数据和对象?
  • 如何找出哪些 CMDlet 可以与管道组合?
  • 如何使自己的函数做好管道准备?

PowerShell 管道的基础知识

管道使得链接两个或多个 CMDlet 成为可能。一个命令的结果将传递到下一个命令。垂直线(“|”)用于链接命令。有些人通过 Linux bash 熟悉这个过程。 PowerShell 与 bash 管道的不同之处在于,可以在 PowerShell 中传递完整的对象,而不仅仅是“哑”文本。

将 PowerShell 管道视为工厂中的装配线。每个 CMDlet 就像这条装配线上的一个工作站。您将产品(例如数据对象)放置在传送带的开头,然后它从一个站移动到另一个站。在每个站 (CMDlet),都会对该产品执行特殊操作或处理,然后再将其传递到下一站。当它到达装配线末端时,您就得到了经过所有必要处理步骤的成品。就像在工厂中一样,您可以根据需要按所需顺序添加任意数量的站 (CMDlet),以获得完美的结果。

[玩转系统] 使用 PowerShell 管道高效工作

以下代码示例说明了 PowerShell 管道的使用:

Get-Service -Name 'wuauserv' | Stop-Service

首先,查询名为“wuauserv”的服务对象。此查询的结果(= 服务对象)现在使用管道传递到下一个 CMDlet。 Stop-Service 现在停止通过管道传递的所有服务对象(在本例中为“wuauserv”服务对象)。

链接多个 CMDlet 更令人兴奋。您可以使用过滤器首先搜索特定服务,然后终止它们。假设要终止某个应用程序(在本例中为“Xbox”)的所有服务,可以使用以下串联:

Get-Service | Where-Object Displayname -like "*xbox*" | Stop-Service

重要的管道 CMDlet

如上一个代码示例所示,可以使用管道来过滤、排序和转发数据。最重要的 CMDlet 是:

  • 位置对象
  • 排序对象
  • 选择对象
  • 组对象
  • T恤对象
  • Foreach-Object

使用Where-Object进行过滤

CMDlet Where-Object 就像一个筛子,只让所需的对象通过。例如,如果您想列出系统上的所有服务,但只查看当前正在运行的服务,则可以使用以下代码:

Get-Service | Where-Object { $_.Status -eq 'Running' }

当然,也可以使用 Where-Object 执行更复杂的查询,如下例所示:

Get-ChildItem -Path 'C:\Logs' -File | Where-Object { $_.Extension -eq '.log' -and $_.Length -gt 1GB }

在这种情况下,将输出“C:\Logs”文件夹中满足以下两个条件的所有文件:

  • .log 作为文件扩展名和
  • 文件大小超过 1GB

使用Sort-Object排序

CMDlet Sort-Object 相应地对数据进行排序。这允许您根据选定的属性对对象的输出进行排序 - 在以下示例中,我们根据各自的状态过滤所有服务,然后根据进程名称进行排序。 -Ascending(升序)和-Descending(降序)参数可用于指定顺序:

Get-Service | Where-Object { $_.Status -eq 'Running' } | Sort-Object Name -Ascending
Get-Service | Where-Object { $_.Status -eq 'Running' } | Sort-Object Name -Descending

使用Select-Object进行选择

如果您想从流经管道的对象中提取特定属性,CMDlet Select-Object 是一个有用的工具。如果您只想显示或处理某些数据,它特别有用。以下是 Select-Object 的简单用法,用于仅获取系统上运行的服务的名称和状态:

Get-Service | Select-Object Name, Status

使用Group-Object进行分组

CMDlet Group-Object 允许您按一个或多个属性对对象进行分组。如果您有大量数据并希望将其划分为逻辑组,这尤其有用。下面是一个示例,其中 Group-Object 用于根据服务的状态对服务进行分组:

# Command: Get-Service | Group-Object -Property Status
# Output:

[玩转系统] 使用 PowerShell 管道高效工作

在此代码块中,服务根据其状态进行分组,并获得一个输出,显示每个状态(正在运行、已停止等)有多少服务可用。

使用 Tee-Object 转发

如果您想在屏幕上显示管道数据并将其写入文件,则 CMDlet Tee-Object 非常有用。它将数据转发到两个位置 - 因此得名“Tee”(类似于 T 字路口)。这是一个例子:

Get-Process | Tee-Object -FilePath "C:\temp\processlist.txt"

在上面的代码块中,进程信息既显示在屏幕上,又写入指定的文件中。

使用 Foreach-Object 进行迭代

CMDlet Foreach-Object 可以为管道中的每个对象执行一个操作或一组操作。当您想要为列表中的每个对象执行特定任务时,这特别有用。这是一个例子:

Get-Service | Foreach-Object { if ($_.Status -eq 'Running') { Write-Output "$($_.Name) is running and its start type is $($_.StartType)" } }

在此示例中,Foreach-Object 用于迭代所有服务。如果服务的状态为“正在运行”,则会生成指定服务名称及其启动类型的输出。

哪些 CMDlet 可以串联?

现在您已经知道如何串联/链接 CMDlet,您可能想知道如何找出哪些 CMDlet 彼此“兼容”。

原则上,如果第二个 CMDlet 接受第一个 CMDlet 的输出对象作为输入对象,则 CMDlet 可以串联/链接。这种情况发生在 ByValue ByPropertyName 中。

流水线按值

CMDlet 直接接受前一个 CMDlet 的输出对象 (OutputObject) 的值作为 InputObject,如以下示例所示:

Get-Service wuauserv | Stop-Service

要确定 CMDlet 的 OutputObject 类型,您可以按以下步骤操作:

[玩转系统] 使用 PowerShell 管道高效工作

输出告诉我们 Get-Service 返回对象类型 System.ServiceProcess.ServiceController。它代表一个控制器,通过它可以寻址和控制底层服务。

要检查 Stop-Service 需要哪些对象类型,我们可以按以下步骤操作:

# Command:Get-Help Stop-Service -Parameter 
InputObject

# Output:

[玩转系统] 使用 PowerShell 管道高效工作

CMDlet Stop-Service 的参数 -InputObject 需要一个 System.ServiceProcess.ServiceController[] 类型的输入值。这意味着 Stop-Service 接受 ServiceController 对象的集合(数组)。 “接受管道输入?true(ByValue)”部分在这里很重要。这意味着如果输入符合预期类型 (Service),Stop-Service 会直接从管道接受此输入。

因此,我们知道我们可以链接两个 CMDlet,并且 Stop-Service 支持 ServiceController 对象 (ByValue)。

管道化按PropertyName

管道传输“ByPropertyName”是另一种类型的链接。这里,CMDlet的输入不是根据所传输的对象的类型来确定的,而是根据对象的属性或参数的名称来确定。

这是一个简单的例子:

 'wuauserv'| Stop-Service

在此示例中,服务名称从 CMDlet Get-Service 传输到 Stop-Service。 CMDlet Stop-Service 通常需要服务名称作为输入才能停止服务。

要查明 CMDlet 是否接受“ByPropertyName”输入,我们可以使用以下命令:

# Command:
Get-Help Stop-Service -Parameter Name

# Output:

[玩转系统] 使用 PowerShell 管道高效工作

在这里我们可以看到 CMDlet Stop-Service-Name 参数需要 String[] 类型的输入,并且它接受根据属性名称从管道输入(请参阅“接受管道输入? true (ByPropertyName)”)。

这意味着,如果从管道传递的对象具有名为 "Name" 的属性(Get-Service 就是这种情况),则此 CMDlet 可以使用这个性质。

在实践中,我们应该始终检查文档,以确保 CMDlet 的预期输入和实际输出匹配,然后再将它们链接到管道中。还需要注意的是,许多 CMDlet 可以支持“ByValue”和“ByPropertyName”,具体取决于提供的数据和预期的输入。

CMDlet 通常被设计为与其“类别”或模块中的类似 CMDlet 兼容。例如,许多输出 User 对象的 Active Directory CMDlet 可以与使用 User 对象作为输入的其他 Active Directory CMDlet 组合在管道中。

最后,在PowerShell中有效使用管道还需要一些实验和经验。使用不同的 CMDlet 并了解它们在实践中如何相互作用会很有帮助。

结论

PowerShell 中的管道功能对于管理员来说是一个强大的工具,并提供了一种简化和自动化各种任务的有效方法。理解和成功运用它的关键在于不断的检验和实践。一旦掌握,使用 PowerShell 管道不仅可以提高效率,还可以根据个人需求创建定制的解决方案和功能。

PowerShell 中的管道功能 stellt ein mächtiges Werkzeug für Administratoren dar并且更有效地进行操作、自动操作和自动操作。 Der Schlüssel zum Verständnis und zur erfolgreichen Anwendung liegt in der konsequenten Auseinandersetzung und Praxis.整个过程中,PowerShell-Pipeline 的工作将不再有效,而是会发生变化,定义运行和功能,并使其成为独立的应用程序。

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

取消回复欢迎 发表评论:

关灯