[玩转系统] 关于管道
作者:精品下载站 日期:2024-12-14 02:20:44 浏览:14 分类:玩电脑
关于管道
简短描述
在 PowerShell 中将命令组合到管道中
详细描述
管道是由管道运算符 (|
) (ASCII 124) 连接的一系列命令。每个管道运算符将前一个命令的结果发送到下一个命令。
第一命令的输出可以作为第二命令的输入被发送以进行处理。该输出可以发送到另一个命令。结果是一个由一系列简单命令组成的复杂命令链或管道。
例如,
Command-1 | Command-2 | Command-3
在此示例中,Command-1
发出的对象被发送到 Command-2
。 Command-2
处理对象并将其发送到 Command-3
。 Command-3
处理对象并将它们发送到管道中。由于管道中没有更多命令,因此结果将显示在控制台上。
在管道中,命令按照从左到右的顺序进行处理。该处理作为单个操作进行处理,并在生成时显示输出。
这是一个简单的例子。以下命令获取记事本进程,然后停止它。
例如,
Get-Process notepad | Stop-Process
第一个命令使用 Get-Process
cmdlet 获取表示记事本进程的对象。它使用管道运算符 (|
) 将进程对象发送到 Stop-Process
cmdlet,从而停止记事本进程。请注意,Stop-Process
命令没有 Name 或 ID 参数来指定进程,因为指定的进程是通过管道。
此管道示例获取当前目录中的文本文件,仅选择长度超过 10,000 字节的文件,按长度对它们进行排序,并在表中显示每个文件的名称和长度。
Get-ChildItem -Path *.txt |
Where-Object {$_.length -gt 10000} |
Sort-Object -Property length |
Format-Table -Property name, length
该管道由按指定顺序排列的四个命令组成。下图显示了每个命令传递到管道中下一个命令时的输出。
Get-ChildItem -Path *.txt
| (FileInfo objects for *.txt)
V
Where-Object {$_.length -gt 10000}
| (FileInfo objects for *.txt)
| ( Length > 10000 )
V
Sort-Object -Property Length
| (FileInfo objects for *.txt)
| ( Length > 10000 )
| ( Sorted by length )
V
Format-Table -Property name, length
| (FileInfo objects for *.txt)
| ( Length > 10000 )
| ( Sorted by length )
| ( Formatted in a table )
V
Name Length
---- ------
tmp1.txt 82920
tmp2.txt 114000
tmp3.txt 114000
使用管道
大多数 PowerShell cmdlet 旨在支持管道。在大多数情况下,您可以通过管道将 Get cmdlet 的结果传送到同一名词的另一个 cmdlet。例如,您可以将 Get-Service
cmdlet 的输出通过管道传输到 Start-Service
或 Stop-Service
cmdlet。
此示例管道在计算机上启动 WMI 服务:
Get-Service wmi | Start-Service
再例如,您可以将 PowerShell 注册表提供程序中的 Get-Item
或 Get-ChildItem
的输出通过管道传输到 New-ItemProperty
cmdlet。此示例将一个新的注册表项 NoOfEmployees(值为 8124)添加到 MyCompany 注册表项中。
Get-Item -Path HKLM:\Software\MyCompany |
New-ItemProperty -Name NoOfEmployees -Value 8124
许多实用程序 cmdlet,例如 Get-Member
、Where-Object
、Sort-Object
、Group-Object
> 和 Measure-Object
几乎专门用于管道。您可以通过管道将任何对象类型传递给这些 cmdlet。此示例演示如何按每个进程中打开的句柄数对计算机上的所有进程进行排序。
Get-Process | Sort-Object -Property handles
您可以通过管道将对象传输到格式化、导出和输出 cmdlet,例如 Format-List
、Format-Table
、Export-Clixml
、导出 CSV 和输出文件
。
此示例演示如何使用 Format-List
cmdlet 显示流程对象的属性列表。
Get-Process winlogon | Format-List -Property *
您还可以将本机命令的输出通过管道传输到 PowerShell cmdlet。例如:
PS> ipconfig.exe | Select-String -Pattern 'IPv4'
IPv4 Address. . . . . . . . . . . : 172.24.80.1
IPv4 Address. . . . . . . . . . . : 192.168.1.45
IPv4 Address. . . . . . . . . . . : 100.64.108.37
这很重要
Success 和 Error 流与其他 shell 的 stdin 和 stderr 流类似。但是,stdin 未连接到 PowerShell 管道以进行输入。有关详细信息,请参阅 about_Redirection。
经过一些练习,您会发现将简单的命令组合到管道中可以节省时间和打字,并使脚本编写更加高效。
管道如何工作
本部分介绍如何将输入对象绑定到 cmdlet 参数并在管道执行期间进行处理。
接受管道输入
为了支持管道传输,接收 cmdlet 必须具有接受管道输入的参数。使用带有 Full 或 Parameter 选项的 Get-Help
命令来确定 cmdlet 的哪些参数接受管道输入。
例如,要确定 Start-Service
cmdlet 的哪些参数接受管道输入,请键入:
Get-Help Start-Service -Full
或者
Get-Help Start-Service -Parameter *
Start-Service
cmdlet 的帮助显示只有 InputObject 和 Name 参数接受管道输入。
-InputObject <ServiceController[]>
Specifies ServiceController objects representing the services to be started.
Enter a variable that contains the objects, or type a command or expression
that gets the objects.
Required? true
Position? 0
Default value None
Accept pipeline input? True (ByValue)
Accept wildcard characters? false
-Name <String[]>
Specifies the service names for the service to be started.
The parameter name is optional. You can use Name or its alias, ServiceName,
or you can omit the parameter name.
Required? true
Position? 0
Default value None
Accept pipeline input? True (ByPropertyName, ByValue)
Accept wildcard characters? false
当您通过管道将对象发送到 Start-Service
时,PowerShell 会尝试将对象与 InputObject 和 Name 参数关联起来。
接受管道输入的方法
Cmdlet 参数可以通过两种不同方式之一接受管道输入:
ByValue:该参数接受与预期 .NET 类型匹配或可以转换为该类型的值。
例如,
Start-Service
的 Name 参数接受管道按值输入。它可以接受字符串对象或可以转换为字符串的对象。ByPropertyName:仅当输入对象具有与参数同名的属性时,该参数才接受输入。
例如,
Start-Service
的 Name 参数可以接受具有 Name 属性的对象。要列出对象的属性,请将其通过管道传递给Get-Member
。
某些参数可以通过值或属性名称接受对象,从而更容易从管道获取输入。
参数绑定
当您通过管道将对象从一个命令传送到另一命令时,PowerShell 会尝试将管道传送的对象与接收 cmdlet 的参数相关联。
PowerShell 的参数绑定组件根据以下条件将输入对象与 cmdlet 参数相关联:
- 该参数必须接受来自管道的输入。
- 该参数必须接受正在发送的对象的类型或可以转换为预期类型的类型。
- 命令中未使用该参数。
例如,Start-Service
cmdlet 有许多参数,但只有其中两个:Name 和 InputObject 接受管道输入。 Name 参数采用字符串,InputObject 参数采用服务对象。因此,您可以通过管道传输字符串、服务对象以及具有可转换为字符串或服务对象的属性的对象。
PowerShell 尽可能高效地管理参数绑定。您不能建议或强制 PowerShell 绑定到特定参数。如果 PowerShell 无法绑定管道对象,该命令将失败。
有关排除绑定错误的更多信息,请参阅本文后面的调查管道错误。
一次处理一个
将对象通过管道传输到命令非常类似于使用命令的参数来提交对象。让我们看一个管道示例。在此示例中,我们使用管道来显示服务对象表。
Get-Service | Format-Table -Property Name, DependentServices
从功能上讲,这就像使用 Format-Table
的 InputObject 参数来提交对象集合。
例如,我们可以将服务集合保存到使用 InputObject 参数传递的变量中。
$services = Get-Service
Format-Table -InputObject $services -Property Name, DependentServices
或者我们可以将命令嵌入到 InputObject 参数中。
Format-Table -InputObject (Get-Service) -Property Name, DependentServices
然而,有一个重要的区别。当您通过管道将多个对象传递到一个命令时,PowerShell 一次将一个对象发送到该命令。当您使用命令参数时,对象将作为单个数组对象发送。这个微小的差异会产生重大的后果。
执行管道时,PowerShell 会自动枚举实现 IEnumerable 接口或其通用对应项的任何类型。枚举的项目一次通过管道发送一个。 PowerShell 还通过 Rows
属性枚举 System.Data.DataTable 类型。
自动枚举有一些例外。
- 您必须为哈希表、实现 IDictionary 接口或其通用对应项的类型以及 System.Xml.XmlNode 调用
GetEnumerator()
方法。类型。 - System.String 类实现
IEnumerable
,但 PowerShell 不枚举字符串对象。
在以下示例中,数组和哈希表通过管道传输到 Measure-Object cmdlet,以计算从管道接收的对象数量。数组有多个成员,哈希表有多个键值对。一次仅枚举一个数组。
@(1,2,3) | Measure-Object
Count : 3
Average :
Sum :
Maximum :
Minimum :
Property :
@{"One"=1;"Two"=2} | Measure-Object
Count : 1
Average :
Sum :
Maximum :
Minimum :
Property :
同样,如果您通过管道将多个进程对象从 Get-Process
cmdlet 传送到 Get-Member
cmdlet,PowerShell 会将每个进程对象(一次一个)发送到 获取会员
。 Get-Member
显示流程对象的 .NET 类(类型)及其属性和方法。
Get-Process | Get-Member
TypeName: System.Diagnostics.Process
Name MemberType Definition
---- ---------- ----------
Handles AliasProperty Handles = Handlecount
Name AliasProperty Name = ProcessName
NPM AliasProperty NPM = NonpagedSystemMemorySize
...
笔记
Get-Member
消除了重复项,因此如果对象全部属于同一类型,则它仅显示一种对象类型。
但是,如果您使用 Get-Member
的 InputObject 参数,则 Get-Member
会接收 System.Diagnostics.Process 数组 对象作为一个整体。它显示对象数组的属性。 (请注意 System.Object 类型名称后面的数组符号 ([]
)。)
例如,
Get-Member -InputObject (Get-Process)
TypeName: System.Object[]
Name MemberType Definition
---- ---------- ----------
Count AliasProperty Count = Length
Address Method System.Object& Address(Int32 )
Clone Method System.Object Clone()
...
这个结果可能不是你想要的。但是当你理解了它之后,你就可以使用它。例如,所有数组对象都有一个 Count 属性。您可以使用它来计算计算机上运行的进程数。
例如,
(Get-Process).count
重要的是要记住,沿着管道发送的对象一次交付一个。
在管道中使用本机命令
PowerShell 允许您在管道中包含本机外部命令。但是,需要注意的是,PowerShell 的管道是面向对象的,不支持原始字节数据。
通过管道传输或重定向输出原始字节数据的本机程序的输出会将输出转换为 .NET 字符串。此转换可能会导致原始数据输出损坏。
但是,PowerShell 7.4 添加了 PSNativeCommandPreserveBytePipe
实验性功能,该功能在将本机命令的 stdout 流重定向到文件或将字节流数据通过管道传输到文件时保留字节流数据。本机命令的 stdin 流。
例如,使用本机命令curl
,您可以下载二进制文件并使用重定向将其保存到磁盘。
$uri = 'https://github.com/PowerShell/PowerShell/releases/download/v7.3.4/powershell-7.3.4-linux-arm64.tar.gz'
# native command redirected to a file
curl -s -L $uri > powershell.tar.gz
您还可以将字节流数据通过管道传输到另一个本机命令的 stdin 流。以下示例使用 curl
下载压缩的 TAR 文件。下载的文件数据被传输至 tar
命令以提取存档的内容。
# native command output piped to a native command
curl -s -L $uri | tar -xzvf - -C .
您还可以将 PowerShell 命令的字节流输出通过管道传输到本机命令的输入。以下示例使用 Invoke-WebRequest
下载与上一示例相同的 TAR 文件。
# byte stream piped to a native command
(Invoke-WebRequest $uri).Content | tar -xzvf - -C .
# bytes piped to a native command (all at once as byte[])
,(Invoke-WebRequest $uri).Content | tar -xzvf - -C .
将 stderr 输出重定向到 stdout 时,此功能不支持字节流数据。当您组合 stderr 和 stdout 流时,组合后的流将被视为字符串数据。
调查管道错误
当 PowerShell 无法将管道对象与接收 cmdlet 的参数关联时,命令将失败。
在下面的示例中,我们尝试将注册表项从一个注册表项移动到另一个注册表项。 Get-Item
cmdlet 获取目标路径,然后将其通过管道传输到 Move-ItemProperty
cmdlet。 Move-ItemProperty
命令指定要移动的注册表项的当前路径和名称。
Get-Item -Path HKLM:\Software\MyCompany\sales |
Move-ItemProperty -Path HKLM:\Software\MyCompany\design -Name product
该命令失败并且 PowerShell 显示以下错误消息:
Move-ItemProperty : The input object can't be bound to any parameters for
the command either because the command doesn't take pipeline input or the
input and its properties do not match any of the parameters that take
pipeline input.
At line:1 char:23
+ $a | Move-ItemProperty <<<< -Path HKLM:\Software\MyCompany\design -Name p
要进行调查,请使用 Trace-Command
cmdlet 跟踪 PowerShell 的参数绑定组件。以下示例在管道执行时跟踪参数绑定。 PSHost 参数在控制台中显示跟踪结果,FilePath 参数将跟踪结果发送到 debug.txt
文件以供以后参考。
Trace-Command -Name ParameterBinding -PSHost -FilePath debug.txt -Expression {
Get-Item -Path HKLM:\Software\MyCompany\sales |
Move-ItemProperty -Path HKLM:\Software\MyCompany\design -Name product
}
跟踪结果很长,但它们显示了绑定到 Get-Item
cmdlet 的值,然后绑定到 Move-ItemProperty
cmdlet 的命名值。
...
BIND NAMED cmd line args [`Move-ItemProperty`]
BIND arg [HKLM:\Software\MyCompany\design] to parameter [Path]
...
BIND arg [product] to parameter [Name]
...
BIND POSITIONAL cmd line args [`Move-ItemProperty`]
...
最后,它表明尝试将路径绑定到 Move-ItemProperty
的 Destination 参数失败。
...
BIND PIPELINE object to parameters: [`Move-ItemProperty`]
PIPELINE object TYPE = [Microsoft.Win32.RegistryKey]
RESTORING pipeline parameter's original values
Parameter [Destination] PIPELINE INPUT ValueFromPipelineByPropertyName NO
COERCION
Parameter [Credential] PIPELINE INPUT ValueFromPipelineByPropertyName NO
COERCION
...
使用 Get-Help
cmdlet 查看Destination 参数的属性。
Get-Help Move-ItemProperty -Parameter Destination
-Destination <String>
Specifies the path to the destination location.
Required? true
Position? 1
Default value None
Accept pipeline input? True (ByPropertyName)
Accept wildcard characters? false
结果显示,Destination 仅“按属性名称”接受管道输入。因此,管道对象必须有一个名为Destination的属性。
使用Get-Member
查看来自Get-Item
的对象的属性。
Get-Item -Path HKLM:\Software\MyCompany\sales | Get-Member
输出显示该项目是一个没有 Destination 属性的 Microsoft.Win32.RegistryKey 对象。这解释了命令失败的原因。
Path 参数接受按名称或按值输入的管道。
Get-Help Move-ItemProperty -Parameter Path
-Path <String[]>
Specifies the path to the current location of the property. Wildcard
characters are permitted.
Required? true
Position? 0
Default value None
Accept pipeline input? True (ByPropertyName, ByValue)
Accept wildcard characters? true
要修复该命令,我们必须在 Move-ItemProperty
cmdlet 中指定目标,并使用 Get-Item
获取我们想要的项目的路径想搬家。
例如,
Get-Item -Path HKLM:\Software\MyCompany\design |
Move-ItemProperty -Destination HKLM:\Software\MyCompany\sales -Name product
内在的线延续
正如已经讨论过的,管道是由管道运算符 (|
) 连接的一系列命令,通常写在一行上。但是,为了便于阅读,PowerShell 允许您将管道拆分为多行。当管道运算符是该行的最后一个标记时,PowerShell 解析器会将下一行连接到当前命令以继续构建管道。
例如,以下单线管道:
Command-1 | Command-2 | Command-3
可以写成:
Command-1 |
Command-2 |
Command-3
后续行中的前导空格并不重要。缩进增强了可读性。
PowerShell 7 添加了对在行开头使用管道字符来延续管道的支持。以下示例展示了如何使用此新功能。
# Wrapping with a pipe at the beginning of a line (no backtick required)
Get-Process | Where-Object CPU | Where-Object Path
| Get-Item | Where-Object FullName -match "AppData"
| Sort-Object FullName -Unique
# Wrapping with a pipe on a line by itself
Get-Process | Where-Object CPU | Where-Object Path
|
Get-Item | Where-Object FullName -match "AppData"
|
Sort-Object FullName -Unique
这很重要
在 shell 中交互工作时,仅当使用 Ctrl+V 粘贴时,才在行首粘贴带有管道的代码。右键单击粘贴操作一次插入一行。由于该行不以管道字符结尾,因此 PowerShell 认为输入是完整的并按输入执行该行。
参见
- about_Objects
- about_参数
- about_Command_Syntax
- about_ForEach
- 上一篇:[精彩网文] 女性在晚年经常学到的 10 堂课
- 下一篇:[玩转系统] 关于路径语法
猜你还喜欢
- 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