我从JSON文件中加载了一些配置,我希望能够检查我刚刚加载的内容,并可能设置一些默认值。
现在,我创建了一个包含信息的哈希表,然后以这种方式加载和检查
$config_info=@{
foo=@{default='' ;type=[string]}
bar=@{default=@();type=[array] }
}
$config = Get-Content $configPath -Raw | ConvertFrom-Json
if(-not [Bool]$config.PSObject.Properties['foo']) {
$config | Add-Member -MemberType NoteProperty -Name 'foo' -Value $config_info.foo.default
}
if($config.foo -isnot $config_info.foo.type) { ... }
但我想知道type=[string]
的表示法有多安全,我是否应该使用type=''.getType()
,它看起来不太自然。
更新1
在过去,我使用Export-Clixml
/Import-Clixml
作为我的配置文件,但生成的文件几乎是人类可读/可编辑的。
我有时也使用点源PS1文件,但对于目前的项目,配置必须由非powershell的人维护。
我想知道的是,type=[string]
是否是一种安全/持久的语法来将''.getType()
存储在变量中。
1条答案
按热度按时间7hiiyaii1#
我想知道的是,
type=[string]
是一个安全/持久的语法来存储''.getType()
在一个变量中,或没有。[string]
类型(System.String
)没有被同名的自定义class
定义所"遮蔽"(这样做是不明智的)。[string]
是一个PowerShell type literal,并且引用. NET类型的这种方式是可以预见的,* 假设类型已经加载到会话中 *,对于内置类型(如System.String
),这是根据定义成立的。[string]
或[regex]
;使用.FullName
属性查看类型的全名;例如[regex].FullName
System.
部分,例如,您可以将System.Text.Encoding
称为[System.Text.Encoding]
或[Text.Encoding]
[string].AssemblyQualifiedName
获得):Version
字段;类似地,Culture
和PublicKeyToken
是可选。ConvertFrom-Json
具有-AsHashtable
开关,该开关将解析结果作为 * 哈希表 * 而不是[pscustomobject]
示例返回。class
类型文字,则可以使用强类型属性,其默认值与输入JSON数据中的属性相对应。输出(请注意
foo
的默认值):注:
Config
示例时使用,并且考虑到PowerShell允许将 * any * 数据类型转换为[string]
,因此仍然接受[string]
类型属性的非字符串输入(导致字符串化)。[int]
类型的属性的值为"abc"
),[Config]
强制转换将导致语句终止错误。Test-Json
通过-Schema
和-SchemaFile
参数支持该验证,仅在PowerShell(核心)中使用,如zett42所建议。