Перебор результирующего набора

#powershell

#powershell

Вопрос:

Когда я запускаю эту команду:

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

Я получаю этот вывод:

Имя
----
AESTSr64
ApplicationFrameHost
BtwRSupportService

Я хочу поместить каждый результат в отдельную переменную типа string и получить ее длину. Я хочу знать, как я могу получить доступ к отдельным возвращенным строкам.

Я попробовал foreach следующим образом:

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

чтобы получить

Имя
----
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
}
  

Комментарии:

1. $k -> $k.Name

2. @MathiasR.Jessen, отличный комментарий, я изменил на [string] $ t = $ k . Имя и это фиксировало длину. Спасибо.

3. [string] не нужно, $k.Name уже имеет тип string 🙂

Ответ №1:

вы можете сделать это просто 🙂

    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)
 }
  

Комментарии:

1. Отлично, большое вам спасибо. Мне было интересно, есть ли у вас какая-либо ссылка, где я мог бы прочитать @{…}, обозначает ли это форматированную строку?

2. Еще раз спасибо за вашу помощь, я все еще изучаю этот материал … и еще около 10 вещей …!

3. приветствую вас 😉 PowerShell — хороший и удобный язык сценариев. хорошего дня

Ответ №2:

Я хочу поместить каждый результат в отдельную переменную типа string и получить ее длину. Я хочу знать, как я могу получить доступ к отдельным возвращенным строкам.

Вы можете сохранить результат в переменной, но обычно он не будет иметь тип string , это будет массив объектов процесса. Если вам действительно нужны строки, вы могли бы сделать это:

 $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. Попробуйте мой второй пример …, который лучше справляется с выполнением того, что вы просили.