【发布时间】:2015-03-06 23:42:57
【问题描述】:
原始问题
我用管道处理单个字符串并使用For-EachObject 处理它,如下所示:
"Test" | % { $_.Substring(0,1) }
使用For-EachObject 处理单个管道项似乎是错误的,部分原因是它会误导未来的代码维护者。不过,我不知道有什么其他方法可以在说“它只是一个项目”的同时捕获字符串。例如,这不起作用。
"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 innerHtml 表达式。管道是我的首选方式,因为在 curl 部分周围加上多个括号看起来很难看。
别名
-
curl是Invoke-WebRequest -
select是Select-Object -
-expand是ExplandProperty -
?是Where-Object -
%是For-EachObject
【问题讨论】:
-
"Test".SubString(0,1)适合你吗? -
确实如此。但有时,管道似乎是最好的工具。
-
管道是为对象流设计的。使用 foreach 迭代它们是非常自然的。如果你写了一个假设管道中只有一个对象的函数,如果前面的命令放入了多个项目,它会做什么?
-
补充一下 Ryan 所说的,'test'.substring(0,1) 的性能比使用管道要好得多。
-
@RyanBemrose 说得好。问题是,我没有写函数。我正在写一系列管道表达式(这是正确的术语吗?)
标签: powershell code-readability