대화 형 콘솔에서 작업 할 때 새 개체를 정의하고 다음과 같이 일부 속성 값을 할당하면 :
$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
...
답변
Write-Host를 사용하지 마십시오.
PowerShell cmdlet 또는 함수에서 정보를 출력하는 올바른 방법은 데이터가 포함 된 개체를 만든 다음 Write-Output을 사용하여 파이프 라인에 해당 개체를 쓰는 것입니다.
이상적으로 스크립트는 개체 ( $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-Member
각 TypeName
컬렉션 (각각 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