循环遍历结果集

时间:2016-10-02 02:08:01

标签: powershell

当我运行此命令时:

$k = Get-Process | select Name -First 3

我得到了这个输出:

Name
----
AESTSr64
ApplicationFrameHost
BtwRSupportService

我想将每个结果放在string类型的单独变量中并获取其长度。我想知道如何访问返回的各个行。

我尝试了一个foreach如下:

foreach ($k in $three) {
  write $k
}

获取

Name
----
AESTSr64
ApplicationFrameHost
BtwRSupportService

我想只输出没有标题和破折号的结果,并在同一行显示每个字符串的长度(当我使用.ToString()转换输入时,我得到空字符串和零长度,因为每个结果是作为对象对待)。

我尝试了这个,但它产生了错误的长度:

foreach ($k in $three) {
  $t = $k | Out-String
  write ("{0} {1}", $t, $t.Length)
}

那我该如何制作这样的东西:

AESTSr64                   08
ApplicationFrameHost       20
BtwRSupportService         18

修改

使用以下答案和注释获得所需结果的一种方法:

$three = Get-Process | select -First 3 | ForEach-Object Name
foreach ($k in $three) {
  [string]$c = "{0,-15} {1}" -f $k, $k.Length
  Write-Host $c
}

2 个答案:

答案 0 :(得分:2)

  

我想将每个结果放在一个单独的类型变量中   字符串并获取其长度。我想知道如何访问个人   行返回。

您可以将结果存储在变量中,但通常它不具有类型字符串,它将是Process对象的数组。如果你真的想要字符串,你可以这样做:

$p = get-process | select -first 3 | ForEach-Object name

但是$p 仍然是一个数组,所以它的长度为3!您可以将长度第一个值设为$p[0].length ...或者您可以像这样划分各个值:

$p1, $p2, $p3 = get-process | select -first 3 | ForEach-Object name

但请注意,在最后一个示例中,如果要返回的对象超过3个,那么p3将是除前两个对象之外的所有对象...

答案 1 :(得分:2)

你可以做到这一点:)

   get-process | select Name, @{Name="NameLength";expression={$_.Name.length}} -first 3

如果你想在结果上循环:

 $list=get-process | select Name, @{Name="NameLength";expression={$_.Name.length}} -first 3

 foreach ($item in $list)
 {
     write-host ("{0} {1}" -f $item.Name, $item.NameLength)
 }