gpt4 book ai didi

powershell - 通过管道传输单个对象并在不使用 For-Each 对象的情况下处理它

转载 作者:行者123 更新时间:2023-12-02 20:24:03 24 4
gpt4 key购买 nike

原始问题

我通过管道传输单个字符串并使用 For-EachObject 对其进行处理,如下所示:

 "Test" | % { $_.Substring(0,1) }

使用 For-EachObject 处理单个管道项似乎是错误的,部分原因是它会误导 future 的代码维护者。不过,我不知道有任何其他方法可以在说“这只是一个项目”的同时捕获字符串。例如,这是行不通的。

"Test" | $_.Substring(0,1)
"Test" | { $_.Substring(0,1) }

如何处理单个对象,同时指示我只需要一个对象?

编辑:添加实际用例

以上是我实际想要完成的任务的简化版本。我收到维基百科文章的第一段,该文章是 a larger function that saves the result to a file 的一部分.

curl "www.wikipedia.org/wiki/Hope,_British_Columbia" | 
select -expand allelements |
? { $_.id -eq "mw-content-text" } |
select -expand innerHTML |
% {
$i = $_.IndexOf("<P>");
$j = $_.IndexOf("</P>");
$_.Substring($i, $j - $i) -replace '<[^>]*>'
}

需要处理单个对象的部分位于select -expand insideHtml表达式之后。管道是我的首选方式,因为在 curl 部分周围放置多个括号看起来很难看。

别名

  • curlInvoke-WebRequest
  • 选择选择对象
  • -expandExplandProperty
  • ?Where-Object
  • %For-EachObject

最佳答案

如果您正在创建单一用途的代码,在其中控制输入和输出,并且始终只有一个对象,那么使用管道就显得矫枉过正,并不真正合适。只需将字符串作为参数传递给您的函数即可。

function f([String]$s) {
$s.Substring(0,1)
}
PS> f "Test"
T

如果您正在构建一个通用函数来从管道获取输入,您的函数需要考虑流中的多个对象。幸运的是,PowerShell 有一种自然的方法,使用 Process{} block 来执行此操作,该 block 对输入管道中的每个项目执行一次。

function f {
param(
[Parameter(ValueFromPipeline=$true)]
[String]$item
)
process {
$item.Substring(0,1)
}
}
PS> '123','abc','#%@' | f
1
a
#

这是一个足够常见的函数,PowerShell 提供了一种简写方式来编写一个函数,该函数从管道中获取一个参数并且仅包含一个进程 block 。

filter f {
$_.SubString(0,1)
}
PS> '123','abc','#%@' | f
1
a
#

关于powershell - 通过管道传输单个对象并在不使用 For-Each 对象的情况下处理它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28909520/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com