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