[powershell] Powershell에서 개체 속성 인쇄

대화 형 콘솔에서 작업 할 때 새 개체를 정의하고 다음과 같이 일부 속성 값을 할당하면 :

$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 창에 출력하도록하려면 어떻게해야합니까?



답변

이 시도:

Write-Host ($obj | Format-Table | Out-String)

또는

Write-Host ($obj | Format-List | Out-String)


답변

이 문제에 대한 내 해결책은 $ () 하위 표현식 블록 을 사용하는 것 입니다.

Add-Type -Language CSharp @"
public class Thing{
    public string Name;
}
"@;

$x = New-Object Thing

$x.Name = "Bill"

Write-Output "My name is $($x.Name)"
Write-Output "This won't work right: $x.Name"

제공 :

My name is Bill
This won't work right: Thing.Name


답변

Powershell에서 개체의 속성 및 값을 인쇄합니다. 아래 예제 는 저에게 잘 맞습니다.

$ pool = Get-Item “IIS : \ AppPools.NET v4.5”

$ 풀 | 회원 가입

   TypeName: Microsoft.IIs.PowerShell.Framework.ConfigurationElement#system.applicationHost/applicationPools#add

Name                        MemberType            Definition
----                        ----------            ----------
Recycle                     CodeMethod            void Recycle()
Start                       CodeMethod            void Start()
Stop                        CodeMethod            void Stop()
applicationPoolSid          CodeProperty          Microsoft.IIs.PowerShell.Framework.CodeProperty
state                       CodeProperty          Microsoft.IIs.PowerShell.Framework.CodeProperty
ClearLocalData              Method                void ClearLocalData()
Copy                        Method                void Copy(Microsoft.IIs.PowerShell.Framework.ConfigurationElement ...
Delete                      Method                void Delete()
...

$ 풀 | Select-Object -Property * # -Property를 생략 할 수 있습니다.

name                        : .NET v4.5
queueLength                 : 1000
autoStart                   : True
enable32BitAppOnWin64       : False
managedRuntimeVersion       : v4.0
managedRuntimeLoader        : webengine4.dll
enableConfigurationOverride : True
managedPipelineMode         : Integrated
CLRConfigFile               :
passAnonymousToken          : True
startMode                   : OnDemand
state                       : Started
applicationPoolSid          : S-1-5-82-271721585-897601226-2024613209-625570482-296978595
processModel                : Microsoft.IIs.PowerShell.Framework.ConfigurationElement
...


답변

팁 # 1

Write-Host를 사용하지 마십시오.

팁 # 12

PowerShell cmdlet 또는 함수에서 정보를 출력하는 올바른 방법은 데이터가 포함 된 개체를 만든 다음 Write-Output을 사용하여 파이프 라인에 해당 개체를 쓰는 것입니다.

-Don Jones : PowerShell 마스터

이상적으로 스크립트는 개체 ( $obj = New-Object -TypeName psobject -Property @{'SomeProperty'='Test'})를 만든 다음 Write-Output $objects. 출력을 Format-Table.

PS C:\> Run-MyScript.ps1 | Format-Table

실제로 PowerShell PowerObjectandPipingShell을 호출해야합니다.


답변

몇 가지 일반적인 참고 사항.


$obj | Select-Object $obj | Select-Object -Property *

후자는 모든 비 내재적, 비 컴파일러 생성 속성을 표시합니다. 전자는 (항상) 모든 속성 유형을 표시 하지 않는 것 같습니다 ( 내 테스트에서는 일관되게 표시되는 것처럼 보입니다 -여기에 보장 없음).CodeProperty MemberType


Get-Member 에 대해 알아야 할 일부 스위치

  • Get-Member기본적으로 정적 멤버를 가져 오지 않습니다 . 또한 비 정적 멤버 와 함께 (직접) 가져올 수 없습니다 . 즉, 스위치를 사용하면 정적 멤버 만 반환됩니다.

    PS Y:\Power> $obj | Get-Member -Static
    
       TypeName: System.IsFire.TurnUpProtocol
    
    Name        MemberType Definition
    ----        ---------- ----------
    Equals      Method     static bool Equals(System.Object objA, System.Object objB)
    ...
  • 를 사용합니다 -Force.

    Get-Member명령은 Force 매개 변수를 사용하여 개체의 내장 멤버 및 컴파일러 생성 멤버를 디스플레이에 추가합니다. Get-Member이러한 멤버를 가져 오지만 기본적으로 숨 깁니다.

    PS Y:\Power> $obj | Get-Member -Static
    
       TypeName: System.IsFire.TurnUpProtocol
    
    Name          MemberType     Definition
    ----          ----------     ----------
    ...
    pstypenames   CodeProperty   System.Collections.ObjectModel.Collection...
    psadapted     MemberSet      psadapted {AccessRightType, AccessRuleType,...
    ...

사용 ConvertTo-Json깊이 읽기 “직렬화”에 대한

JSON ( 대신 사용)을 사용하여 객체를 저장하는 것을 권장 하지 않습니다Export-Clixml . 그러나에서 다소 읽을 수있는 출력을 얻을 수 있으므로 ConvertTo-Json깊이를 지정할 수도 있습니다.

지정하지 않는 참고 Depth의미-Depth 2

PS Y:\Power> ConvertTo-Json $obj -Depth 1
{
    "AllowSystemOverload":  true,
    "AllowLifeToGetInTheWay":  false,
    "CantAnyMore": true,
    "LastResortOnly": true,
...

그리고 읽을 계획이 없다면 할 수 -Compress있습니다 (예 : 공백 제거)

PS Y:\Power> ConvertTo-Json $obj -Depth 420 -Compress

-InputObject할 수 있으면 사용하십시오.

PowerShell을 사용할 때 99.9 %의 시간 : 성능이 중요하지 않거나 성능에 관심이 없습니다. 그러나 필요하지 않을 때 파이프를 피하면 오버 헤드를 줄이고 속도를 더할 수 있습니다 (일반적으로 파이프는 비효율적입니다).

즉, 당신이 가진 모든 것이 $obj인쇄에 편리 하다면 (그리고 때때로 나처럼 타이핑하기에 너무 게으르지 않습니다 -InputObject) :

# select is aliased (hardcoded) to Select-Object
PS Y:\Power> select -Property * -InputObject $obj
# gm is aliased (hardcoded) to Get-Member
PS Y:\Power> gm -Force -InputObject $obj

주의 사항 Get-Member -InputObject:
$ obj가 컬렉션 (예 🙂 이면 System.Object[]컬렉션 개체 자체에 대한 정보를 얻게됩니다.

PS Y:\Power> gm -InputObject $obj,$obj2
   TypeName: System.Object[]

Name        MemberType            Definition
----        ----------            ----------
Count       AliasProperty         Count = Length
...

당신이 원하는 경우 Get-MemberTypeName컬렉션 (각각 NB TypeName, 하지 각 개체에 대해 – N의 모음 같은 모든 개체 TypeName아니라 1 표를 인쇄 할 TypeName각 개체에 대한하지 N 테이블)을 … 직접 배관 만하면됩니다.


답변

아래는 저에게 정말 좋았습니다. 위의 모든 답변을 함께 패치하고 다음 링크에서 객체 속성을 표시하는 방법 에 대해 읽고 객체 인쇄에 대한 아래의 짧은 읽기를 생각해 냈습니다.

print_object.ps1이라는 파일에 다음 텍스트를 추가합니다.

$date = New-Object System.DateTime
Write-Output $date | Get-Member
Write-Output $date | Select-Object -Property *

powershell 명령 프롬프트를 열고 해당 파일이있는 디렉터리로 이동하여 다음을 입력합니다.

powershell -ExecutionPolicy ByPass -File is_port_in_use.ps1 -Elevated

‘System.DateTime’을 인쇄하려는 객체로 대체하십시오. 개체가 null이면 아무것도 인쇄되지 않습니다.


답변

# Json to object
$obj = $obj | ConvertFrom-Json
Write-host $obj.PropertyName