在交互式控制台中工作时,如果我定义一个新对象并为其分配一些属性值,如下所示:
$obj = New-Object System.String
$obj | Add-Member NoteProperty SomeProperty "Test"
Run Code Online (Sandbox Code Playgroud)
然后,当我在交互式窗口中键入我的变量名称时,Powershell为我提供了对象属性和值的摘要:
PS C:\demo> $obj
SomeProperty
------------
Test
Run Code Online (Sandbox Code Playgroud)
我基本上想要这样做,但是从脚本中的函数内部做.该函数创建一个对象并设置一些属性值,我希望它在返回之前将对象值的摘要打印到Powershell窗口.我尝试在函数中使用Write-Host:
Write-Host $obj
Run Code Online (Sandbox Code Playgroud)
但这只是输出对象的类型而不是摘要:
System.Object
Run Code Online (Sandbox Code Playgroud)
如何让我的函数输出对象属性值的摘要到Powershell窗口?
mjo*_*nor 161
试试这个:
Write-Host ($obj | Format-Table | Out-String)
Run Code Online (Sandbox Code Playgroud)
要么
Write-Host ($obj | Format-List | Out-String)
Run Code Online (Sandbox Code Playgroud)
Dav*_*ers 25
我对这个问题的解决方案是使用$()子表达式块.
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"
Run Code Online (Sandbox Code Playgroud)
得到:
My name is Bill
This won't work right: Thing.Name
Run Code Online (Sandbox Code Playgroud)
cat*_*yes 14
在Powershell中打印出对象的属性和值.以下示例适合我.
$ pool = Get-Item"IIS:\ AppPools.NET v4.5"
$ pool | 获得会员
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()
...
Run Code Online (Sandbox Code Playgroud)
$ pool | 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
...
Run Code Online (Sandbox Code Playgroud)
E.V*_*.L. 10
永远不要使用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
Run Code Online (Sandbox Code Playgroud)
他们应该真的调用PowerShell PowerObjectandPipingShell.
一些一般注意事项。
$obj | Select-Object ? $obj | Select-Object -Property * 后者将显示所有非内在的、非编译器生成的属性。前者似乎并不(总是)显示所有的属性类型(在我的测试中,它似乎显示CodeProperty MemberType一致,但这里没有保证)。
Get-Member并没有在默认情况下得到的静态成员。您也不能(直接)将它们与非静态成员一起使用。也就是说,使用 switch 只会返回静态成员:
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)
...
Run Code Online (Sandbox Code Playgroud)使用-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,...
...
Run Code Online (Sandbox Code Playgroud)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,
...
Run Code Online (Sandbox Code Playgroud)
如果您不打算阅读它,您可以阅读-Compress它(即去除空格)
PS Y:\Power> ConvertTo-Json $obj -Depth 420 -Compress
Run Code Online (Sandbox Code Playgroud)
-InputObject,如果你可以(而且愿意)使用 PowerShell 时 99.9% 的时间:要么性能无关紧要,要么您不关心性能。但是,应该注意的是,在不需要管道时避免使用管道可以节省一些开销并增加一些速度(管道通常不是非常高效)。
也就是说,如果您拥有的只是一个$obj方便的打印工具(并且不会像我一样有时懒得打字-InputObject):
# select is aliased (hardcoded) to Select-Object
PS Y:\Power> select -Property * -InputObject $obj
Run Code Online (Sandbox Code Playgroud)
# gm is aliased (hardcoded) to Get-Member
PS Y:\Power> gm -Force -InputObject $obj
Run Code Online (Sandbox Code Playgroud)
警告Get-Member -InputObject:
如果 $obj 是一个集合(例如System.Object[]),您最终会获得有关集合对象本身的信息:
PS Y:\Power> gm -InputObject $obj,$obj2
TypeName: System.Object[]
Name MemberType Definition
---- ---------- ----------
Count AliasProperty Count = Length
...
Run Code Online (Sandbox Code Playgroud)
如果你想Get-Member为TypeName集合中的每个(注意每个对象TypeName,而不是每个对象——一个 N 个对象的集合,所有相同的对象TypeName只会打印 1 个表,而TypeName不是每个对象的 N 个表)......只需坚持直接管道它。
| 归档时间: |
|
| 查看次数: |
128085 次 |
| 最近记录: |