Если при работе в интерактивной консоли я определяю новый объект и присваиваю ему некоторые значения свойств следующим образом:
$obj = New-Object System.String
$obj | Add-Member NoteProperty SomeProperty "Test"
Затем, когда я ввожу имя своей переменной в интерактивное окно, Powershell дает мне сводку свойств и значений объекта:
PS C:\demo> $obj
SomeProperty
------------
Test
Я в основном хочу сделать это, но из функции скрипта. Функция создает объект и устанавливает некоторые значения свойств, и я хочу, чтобы он распечатал сводку значений объекта в окне Powershell перед возвратом. Я пробовал использовать Write-Host в функции:
Write-Host $obj
Но это просто выводит тип объекта, а не сводку:
System.Object
Как сделать так, чтобы моя функция выводила сводку значений свойств объекта в окно Powershell?
powershell
Джон
источник
источник
-Force
параметр, чтобы он работал, напримерWrite-Host ($obj | Format-List -Force | Out-String)
...
. Я ненавижу POSH$objs = @();
и$objs = $objs + $obj;
я могу использоватьConvertTo-Html
: $ cols = $ objs | ConvertTo-Html -Fragment -Property Name, DataType, Default, Identity, InPrimaryKey, IsForeignKey, Description;Мое решение этой проблемы заключалось в использовании блока подвыражения $ () .
дает:
источник
Чтобы распечатать свойства и значения объекта в Powershell. Примеры ниже подходят мне.
$ pool = Get-Item "IIS: \ AppPools.NET v4.5"
$ бассейн | Get-Member
$ бассейн | Select-Object -Property * # Вы можете опустить -Property
источник
$x | select *
, отлично подходит для интерактивного.Совет # 1
Совет № 12
-Дон Джонс: Мастер PowerShell
В идеале ваш сценарий должен создавать ваши объекты (
$obj = New-Object -TypeName psobject -Property @{'SomeProperty'='Test'}
), а затем просто выполнятьWrite-Output $objects
. Вы должны направить вывод вFormat-Table
.Им действительно следует называть PowerShell PowerObjectandPipingShell.
источник
Never use Write-Host.
утверждением. Вы не можете использовать Write-Output внутри функций, возвращающих данные, потому что это «загрязнит» эту функцию. Простой пример. Угадайте, что будет выводить функция ReturnText? Вот почему я всегда использую внутри функций Write-host. function ReturnText () {Write-Output "Some random message" return "What I want to return"}Несколько общих замечаний.
$obj | Select-Object
⊆$obj | Select-Object -Property *
Последний покажет все не внутренние, не созданные компилятором свойства. Первый, похоже, не (всегда) показывает все типы свойств (в моих тестах он, похоже, показывает
CodeProperty
MemberType
последовательно - здесь нет никаких гарантий).Некоторые переключатели, о которых следует знать для Get-Member
Get-Member
никак не получить статические члены по умолчанию. Вы также не можете (напрямую) получить их вместе с нестатическими членами. То есть использование переключателя приводит к возврату только статических членов:Используйте расширение
-Force
.Используйте
ConvertTo-Json
для глубины и удобочитаемой "сериализации"Я не рекомендую сохранять объекты с помощью JSON (используйте
Export-Clixml
вместо этого). Однако вы можете получить более или менее читаемый выводConvertTo-Json
, который также позволяет указать глубину.Обратите внимание, что отсутствие указания
Depth
подразумевает-Depth 2
И если вы не планируете его читать, вы можете
-Compress
это (т.е. убрать пробелы)Используйте,
-InputObject
если можете (и хотите)В 99,9% случаев при использовании PowerShell: либо производительность не имеет значения, либо вы не заботитесь о производительности. Однако следует отметить, что отказ от канала, когда он вам не нужен, может сэкономить некоторые накладные расходы и добавить некоторую скорость (трубопровод, как правило, не сверхэффективен).
То есть, если у вас есть все, что у вас есть, это единственный
$obj
удобный для печати (и не слишком ленив, как я иногда, чтобы печатать-InputObject
):Предостережение
Get-Member -InputObject
: если $ obj является коллекцией (напримерSystem.Object[]
), вы получите информацию о самом объекте коллекции:Если вы хотите
Get-Member
для каждогоTypeName
в коллекции (NB для каждогоTypeName
, а не для каждого объекта - набор из N объектов со всеми одинаковымиTypeName
будет печатать только 1 таблицу для этогоTypeName
, а не N таблиц для каждого объекта) ...... просто вставьте его напрямую.источник
Приведенное ниже сработало для меня очень хорошо. Я исправил все вышеперечисленные ответы, а также прочитал об отображении свойств объекта по следующей ссылке и придумал ниже краткое прочтение о печати объектов
добавьте следующий текст в файл с именем print_object.ps1:
откройте командную строку PowerShell, перейдите в каталог, в котором существует этот файл, и введите следующее:
Просто замените System.DateTime на любой объект, который вы хотите напечатать. Если объект равен нулю, ничего не распечатывается.
источник
источник