我分享了两个函数,它们比通常更进一步地显示 PowerShell 值(包括空的 $Null's、空数组等):
将 PowerShell 对象序列化为 PowerShell
Object Notation (PSON)
最终目标是能够扭转一切
标准命令Invoke-Expression 并将其解析回
PowerShell 对象。
另一个是我用的ConvertTo-Text(别名CText)函数
我的Log-Entry
framework。注意
具体行:我写的Log "Several examples that usually aren't displayed
by Write-Host:" $NotSet @() @(@()) @(@(), @()) @($Null)
在示例中。
Function Global:ConvertTo-Text1([Alias("Value")]$O, [Int]$Depth = 9, [Switch]$Type, [Switch]$Expand, [Int]$Strip = -1, [String]$Prefix, [Int]$i) {
Function Iterate($Value, [String]$Prefix, [Int]$i = $i + 1) {ConvertTo-Text $Value -Depth:$Depth -Strip:$Strip -Type:$Type -Expand:$Expand -Prefix:$Prefix -i:$i}
$NewLine, $Space = If ($Expand) {"`r`n", ("`t" * $i)} Else{"", ""}
If ($O -eq $Null) {$V = '$Null'} Else {
$V = If ($O -is "Boolean") {"`$$O"}
ElseIf ($O -is "String") {If ($Strip -ge 0) {'"' + (($O -Replace "[\s]+", " ") -Replace "(?<=[\s\S]{$Strip})[\s\S]+", "...") + '"'} Else {"""$O"""}}
ElseIf ($O -is "DateTime") {$O.ToString("yyyy-MM-dd HH:mm:ss")}
ElseIf ($O -is "ValueType" -or ($O.Value.GetTypeCode -and $O.ToString.OverloadDefinitions)) {$O.ToString()}
ElseIf ($O -is "Xml") {(@(Select-XML -XML $O *) -Join "$NewLine$Space") + $NewLine}
ElseIf ($i -gt $Depth) {$Type = $True; "..."}
ElseIf ($O -is "Array") {"@(", @(&{For ($_ = 0; $_ -lt $O.Count; $_++) {Iterate $O[$_]}}), ")"}
ElseIf ($O.GetEnumerator.OverloadDefinitions) {"@{", (@(ForEach($_ in $O.Keys) {Iterate $O.$_ "$_ = "}) -Join "; "), "}"}
ElseIf ($O.PSObject.Properties -and !$O.value.GetTypeCode) {"{", (@(ForEach($_ in $O.PSObject.Properties | Select -Exp Name) {Iterate $O.$_ "$_`: "}) -Join "; "), "}"}
Else {$Type = $True; "?"}}
If ($Type) {$Prefix += "[" + $(Try {$O.GetType()} Catch {$Error.Remove($Error[0]); "$Var.PSTypeNames[0]"}).ToString().Split(".")[-1] + "]"}
"$Space$Prefix" + $(If ($V -is "Array") {$V[0] + $(If ($V[1]) {$NewLine + ($V[1] -Join ", $NewLine") + "$NewLine$Space"} Else {""}) + $V[2]} Else {$V})
}; Set-Alias CText ConvertTo-Text -Scope:Global -Description "Convert value to readable text"
转换为文本
ConvertTo-Text 函数(别名 CText)递归地将 PowerShell 对象转换为可读文本,其中包括哈希表、自定义对象和显示类型详细信息(例如 $Null 与空字符串)。
语法
ConvertTo-Text [<Object>] [[-Depth] <int>] [[-Strip] <int>] <string>] [-Expand] [-Type]
参数
<Object>
应转换为可读值的对象(位置 0)。
-Depth <int>
显示嵌入对象的最大递归迭代次数。
ConvertTo-Text 的默认深度是 9。
-Strip <int>
如果提供的值等于或大于0,则截断给定长度的字符串并删除多余的空白字符。设置-Strip -1 可防止截断和删除带有空格的字符。
ConvertTo-Text 的默认值为 -1。
-Expand
将嵌入对象扩展到多行以提高可读性。
-Type
通过在对象前面添加[<Type>] 来明确显示对象的类型。
注意:参数$Prefix供内部使用。
示例
以下命令返回一个字符串,描述$var 变量所包含的对象:
ConvertTo-Text $Var
以下命令返回一个包含示例中所示哈希表的字符串(而不是System.Collections.DictionaryEntry...):
ConvertTo-Text @{one = 1; two = 2; three = 3}
以下命令显示 PowerShell 通常不显示的值(例如 $Null):
ConvertTo-Text @{Null = $Null; EmptyString = ""; EmptyArray = @(); ArrayWithNull = @($Null); DoubleEmptyArray = @(@(), @())} -Expand
以下命令返回一个字符串,显示 WinNT User 对象的深度最高为 5 级,并将嵌入的对象扩展为多行:
ConvertTo-Text ([ADSI]"WinNT://./$Env:Username") -Depth 5 -Expand