以PowerShell对象表示法(PSON)保存哈希表

cra*_*aig 10 powershell serialization expression powershell-2.0

从文件中加载PowerShell哈希表的问题记录如何将包含PSON格式的哈希表的文件加载到变量中,但是如何将哈希表保存为PSON格式的文件?

哈希表:

@{            
 "name" = "report 0"            
 "parameters" = @(
    @{"name" = "parameter 0"; "default" = 1; "values"=1,2,3,4},
    @{"name" = "parameter 1"; "default" = 'A'; "values" = 'A','B','C'}
    )            
}
Run Code Online (Sandbox Code Playgroud)

iRo*_*Ron 11

我遇到了同样的问题.

使用ConvertTo-JSON确实是最明显的工作,但在早期版本的PowerShell中,这个Cmdlet不可用,除非你不想用另一种语言交换任何数据,为什么还要说另一种语言(例如JSON)?我发现ConvertTo-PSON Cmdlet可以很好地存储数据,也非常有助于显示,显示和探索对象变量的确切信息,因此结果如下:

$Object = &($Object | ConverTo-Expression)
Run Code Online (Sandbox Code Playgroud)

我昵称(别名)它只是PSON,因为ConvertFrom-PSON cmdlet确实已经以以下形式存在:Invoke-Expression:

Install-Script -Name ConvertTo-Expression
Run Code Online (Sandbox Code Playgroud)

它将我在此处列出的大多数(全部?)本机PowerShell对象类型转换为单个测试对象:

. .\ConvertTo-Expression.ps1
Run Code Online (Sandbox Code Playgroud)

要将对象转换为PSON字符串,您只需提供命令:

ConvertTo-Expression $Craig
@{
        'name' = 'report 0'
        'parameters' =
                @{
                        'values' =
                                1,
                                2,
                                3,
                                4
                        'default' = 1
                        'name' = 'parameter 0'
                },
                @{
                        'values' =
                                'A',
                                'B',
                                'C'
                        'default' = 'A'
                        'name' = 'parameter 1'
                }
}
Run Code Online (Sandbox Code Playgroud)

此基本示例将对象转换为类似于ConvertTo-JSON cmdlet 的PowerShell字符串,该字符串可以使用本机Invoke-Expression PowerShell cmdlet 再次转换回来.

严格

的ConvertTo-PSON还具有-strict它通过明确地添加类型名称,这将带来了很大的优势,以JSON格式防止任何类型的投射选项.这种类型转换通常会在转换它们时使用对象类型:

ConvertTo-Expression $Craig -expand 3
@{
        'name' = 'report 0'
        'parameters' =
                @{'values' = 1, 2, 3, 4; 'default' = 1; 'name' = 'parameter 0'},
                @{'values' = 'A', 'B', 'C'; 'default' = 'A'; 'name' = 'parameter 1'}
}
Run Code Online (Sandbox Code Playgroud)

要将对象存储在例如文件,注册表,数据库等中,最好使用-Strict选项并定义0层,这将压缩数据(删除所有空格):

ConvertTo-Expression $Craig -expand 3 -Strong
[hashtable]@{
        'name' = [string]'report 0'
        'parameters' = [array](
                [hashtable]@{'values' = [array]([int]1, [int]2, [int]3, [int]4); 'default' = [int]1; 'name' = [string]'parameter 0'},
                [hashtable]@{'values' = [array]([string]'A', [string]'B', [string]'C'); 'default' = [string]'A'; 'name' = [string]'parameter 1'}
        )
}
Run Code Online (Sandbox Code Playgroud)

图层

layers选项将定义图层级别如何在单独的行上展开.每个图层级别都会获得额外的标签缩进.

-Layers 0一行没有任何空格(压缩模式)

-Layers 1一行格式化空格(默认)

-Layers X多个图层在多行上展开,直到深度达到X级(缩进)

让我们将PSON字符串转换回来并确认结果:

$Object = &($Object | ConverTo-Expression)
Run Code Online (Sandbox Code Playgroud)

这是结果:

Install-Script -Name ConvertTo-Expression
Run Code Online (Sandbox Code Playgroud)

深度

depth选项类似于ConvertTo-JSON命令中的深度选项.默认情况下,深度限制为9个级别.深度为0级别将删除字符串中的双引号,这可能会在您期望字符串的情况下派上用场,但如果不是,则希望收到警报,例如:

. .\ConvertTo-Expression.ps1
Run Code Online (Sandbox Code Playgroud)

PowerShell 2.0除了在运行PowerShell 2.0时ScriptBlock将替换的类型外String,如果您希望使用PowerShell 2.0从更高版本的PowerShell交换数据,则可以使用-Version 2.0选项.

例子

使用Craig原始问题中的哈希表:

ConvertTo-Expression $Craig
@{
        'name' = 'report 0'
        'parameters' =
                @{
                        'values' =
                                1,
                                2,
                                3,
                                4
                        'default' = 1
                        'name' = 'parameter 0'
                },
                @{
                        'values' =
                                'A',
                                'B',
                                'C'
                        'default' = 'A'
                        'name' = 'parameter 1'
                }
}
Run Code Online (Sandbox Code Playgroud)

写主机(PSON $克雷格) #标准

ConvertTo-Expression $Craig -expand 3
@{
        'name' = 'report 0'
        'parameters' =
                @{'values' = 1, 2, 3, 4; 'default' = 1; 'name' = 'parameter 0'},
                @{'values' = 'A', 'B', 'C'; 'default' = 'A'; 'name' = 'parameter 1'}
}
Run Code Online (Sandbox Code Playgroud)

写主机(PSON $ Craig -Layers 0) #压缩

ConvertTo-Expression $Craig -expand 3 -Strong
[hashtable]@{
        'name' = [string]'report 0'
        'parameters' = [array](
                [hashtable]@{'values' = [array]([int]1, [int]2, [int]3, [int]4); 'default' = [int]1; 'name' = [string]'parameter 0'},
                [hashtable]@{'values' = [array]([string]'A', [string]'B', [string]'C'); 'default' = [string]'A'; 'name' = [string]'parameter 1'}
        )
}
Run Code Online (Sandbox Code Playgroud)

写主机(PSON $ Craig -Layers 3) #3层

$Object = &($Object | ConverTo-Expression)
Run Code Online (Sandbox Code Playgroud)

写主机(PSON $ Craig -Strict -Layers 9) #Strict,9(全部)层

Install-Script -Name ConvertTo-Expression
Run Code Online (Sandbox Code Playgroud)

有关最新的看到:&PowerShell的画廊.


Sha*_*evy 9

试试*-CliXmlcmdlet.要保存对象:

@{            
 "name" = "report 0"            
 "parameters" = @(
    @{"name" = "parameter 0"; "default" = 1; "values"=1,2,3,4},
    @{"name" = "parameter 1"; "default" = 'A'; "values" = 'A','B','C'}
    )            
} | Export-Clixml -Path c:\hash.xml
Run Code Online (Sandbox Code Playgroud)

读回来:

Import-Clixml c:\hash.xml
Run Code Online (Sandbox Code Playgroud)