PowerShell 技能连载 - 通过管道输入数据

在前一个技能里我们演示了 Convert-Umlaut 如何转换一个字符串中的特殊字符。这在一个函数接受管道输入的时候更有用。让我们来看看增加这种特性所需要做的改变。

在不支持管道的情况下,该函数大概长这个样子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#requires -Version 3

function Convert-Umlaut
{
param
(
[Parameter(Mandatory)]
$Text
)

$output = $Text.Replace('ö','oe').Replace('ä','ae').Replace('ü','ue').Replace('ß','ss').Replace('Ö','Oe').Replace('Ü','Ue').Replace('Ä','Ae')
$isCapitalLetter = $Text -ceq $Text.toUpper()
if ($isCapitalLetter)
{
$output = $output.toUpper()
}
$output
}

可以通过这种方式执行:

1
2
PS C:\> Convert-Umlaut -Text "Mößler, Christiansön"
Moessler, Christiansoen

然而,它不能像这样执行:

1
PS C:\> "Mößler, Christiansön" | Convert-Umlaut

要增加管道功能,需要做两件事:

  1. 参数需要标记为支持管道数据。
  2. 在迭代中对每个输入的元素进行处理的代码需要放置在 “process“ 代码块中。

以下是改变后的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#requires -Version 3

function Convert-Umlaut
{
param
(
[Parameter(Mandatory, ValueFromPipeline)]
$Text
)

process
{
$output = $Text.Replace('ö','oe').Replace('ä','ae').Replace('ü','ue').Replace('ß','ss').Replace('Ö','Oe').Replace('Ü','Ue').Replace('Ä','Ae')
$isCapitalLetter = $Text -ceq $Text.toUpper()
if ($isCapitalLetter)
{
$output = $output.toUpper()
}
$output
}
}

现在,也可以通过管道传输数据了:

1
2
PS C:\> "Mößler, Christiansön" | Convert-Umlaut
Moessler, Christiansoen

PowerShell 技能连载 - 通过管道输入数据

http://blog.vichamp.com/2016/09/01/receiving-input-via-pipeline/

作者

吴波

发布于

2016-09-01

更新于

2022-07-06

许可协议

评论