17

从文件加载 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'}
    )            
}
4

4 回答 4

13

5 年后,我粘贴在原始答案中的 cmdlet 经历了如此多的更新,以至于它已经完全过时了。因此,我用最新版本的链接替换了代码自述文件。

除了支持更多的对象类型和更好的格式之外,它现在输出一个表达式 ( ScriptBlock),其默认显示类型仍然是 aString并允许使用调用运算符直接调用&

$Object = &($Object | ConverTo-Expression)

转换为表达式

ConvertTo-Expression可以使用以下命令从 PowerShell 库下载 cmdlet :

Install-Script -Name ConvertTo-Expression

自述文件

完整的自述文件(和源代码)可从 GitHub 获得:
https ://github.com/iRon7/ConvertTo-Expression

安装

下载后(Install-Script -Name ConvertTo-Expression),脚本可以简单地通过点源调用:

. .\ConvertTo-Expression.ps1

您还可以考虑通过将脚本重命名为 PowerShell 模块 ( .psm1) 文件并将其移动到$env:PSModulePath. 有关更多详细信息,请参阅:如何编写 PowerShell 脚本模块

回答

以下是序列化问题中特定示例(分配给$Craig)的一些可能选项:

ConvertTo-Expression $Craig
@{
    parameters =
        @{
            name = 'parameter 0'
            default = 1
            values =
                1,
                2,
                3,
                4
        },
        @{
            name = 'parameter 1'
            default = 'A'
            values =
                'A',
                'B',
                'C'
        }
    name = 'report 0'
}

限制树视图扩展:(
Expand -0输出一行并Expand -1删除不必要的空格)

ConvertTo-Expression $Craig -expand 3
@{
    parameters =
        @{name = 'parameter 0'; default = 1; values = 1, 2, 3, 4},
        @{name = 'parameter 1'; default = 'A'; values = 'A', 'B', 'C'}
    name = 'report 0'
}

保留显式类型(强类型):

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

(注意:根据 PowerShell 设计,HashTables 不是按顺序排列的,但如果需要,您可以改用该[Ordered]类型。)

于 2014-07-20T19:49:55.003 回答
11

尝试*-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

读回来:

Import-Clixml c:\hash.xml
于 2013-02-28T16:00:49.903 回答
3

一种方法是将哈希表定义放在脚本块中:

$hashtable = {
  @{            
    "name" = "report 0"            
    "parameters" = @(
        @{"name" = "parameter 0"; "default" = 1; "values"=1,2,3,4},
        @{"name" = "parameter 1"; "default" = 'A'; "values" = 'A','B','C'}
        )            
    }
}

$hashtable.tostring()

@{
"name" = "report 0"
"parameters" = @( @{"name" = "parameter 0"; "default" = 1; "values"=1,2,3,4}, @{"name " = "参数 1"; "默认" = 'A'; "值" = 'A','B','C'})
}

在脚本中,您需要调用脚本块来实例化哈希表:

$hash = .$hashtable
于 2013-02-28T16:18:29.510 回答
0

如何使用速记“对象表示法”在 PowerShell 中生成对象:

$object = New-Object -TypeName PSObject -Property @{name="foo";age=21}

免责声明:我知道这不能直接回答 OP 的问题,但它可能会帮助像我这样的人搜索一个非常相似的问题并登陆这里。

于 2016-11-15T10:46:57.413 回答