使用PowerShell分割string,并对每个令牌执行一些操作

我想在空间上分割pipe道的每一行,然后在自己的行上打印每个标记。

我意识到我可以使用这个结果:

(cat someFileInsteadOfAPipe).split(" ") 

但是我想要更多的灵活性。 我希望能够对每个令牌做任何事情。 (我曾经在Unix上使用AWK ,并且试图获得相同的function。)

我目前有:

 echo "Once upon a time there were three little pigs" | %{$data = $_.split(" "); Write-Output "$($data[0]) and whatever I want to output with it"} 

这显然只打印第一个标记。 是否有一种方法可以让我为每一个令牌分别打印?

另外, %{$data = $_.split(" "); Write-Output "$($data[0])"} %{$data = $_.split(" "); Write-Output "$($data[0])"}部分我从一个博客,我真的不明白我在做什么或如何的语法工作。

我想谷歌,但我不知道该怎么称呼它。 请给我一两个字给Google,或者给我一个链接,向我解释%和所有$符号的作用,以及开始和结束括号的意义。

我意识到我实际上不能使用(cat someFileInsteadOfAPipe).split(" ") ,因为文件(或更好的传入pipe道)包含多行。

关于一些答案:

如果在标记化之前使用Select-String过滤输出,则需要记住, Select-String命令的输出不是string的集合,而是MatchInfo对象的集合。 要获得想要分割的string,需要访问MatchInfo对象的Line属性,如下所示:

 cat someFile | Select-String "keywordFoo" | %{$_.Line.Split(" ")} 
 "Once upon a time there were three little pigs".Split(" ") | ForEach { Write-Host "$_ is a token" } 

关键是$_ ,它代表pipe道中的当前variables。

关于您在网上find的代码:

%ForEach-Object的别名。 对于每个收到的对象,括号中的任何内容都会运行一次。 在这种情况下,它只运行一次,因为你发送一个string。

$_.Split(" ")取当前variables并将其分开。 当前variables将是ForEach当前正在循环的任何variables。