【发布时间】:2017-06-13 08:37:37
【问题描述】:
Powershell command-let ConvertTo-Json 有以下限制 1)它将枚举值返回为整数而不是它们的文本 2)它不会以可读格式返回日期
对于第 1 点,请参见下文,Status 和 VerificationMethod 属性
PS C:\Windows\system32> Get-Msoldomain | ConvertTo-Json
{
"ExtensionData": {
},
"Authentication": 0,
"Capabilities": 5,
"IsDefault": true,
"IsInitial": true,
"Name": "myemail.onmicrosoft.com",
"RootDomain": null,
"Status": 1,
"VerificationMethod": 1
}
为了解决这个问题,我改变了我的命令如下
PS C:\Windows\system32> Get-Msoldomain | ConvertTo-Csv | ConvertFrom-Csv | ConvertTo-Json
{
"ExtensionData": "System.Runtime.Serialization.ExtensionDataObject",
"Authentication": "Managed",
"Capabilities": "Email, OfficeCommunicationsOnline",
"IsDefault": "True",
"IsInitial": "True",
"Name": "curtisjmspartnerhotmail.onmicrosoft.com",
"RootDomain": "",
"Status": "Verified",
"VerificationMethod": "DnsRecord"
}
现在您看到了,枚举返回时带有上面的文本值(Status 和 VerificationMethod),而不是它们的整数值。
但是,这种方法有一些限制:
1) ConvertTo-Csv 不保留数组或复杂对象,并且 将它们作为类名输出(观看 ExtensionData 属性 在两个输出中)。在第二个输出中,我们倾向于丢失数据, 并获得类名 System.Runtime.Serialization.ExtensionDataObject 作为字符串
2) ConvertTo-Csv 和 ConvertFrom-Csv 都不是脚本级别的 命令行开关,但它们是命令级命令行开关,这意味着 我们不能在脚本结尾使用它们,但它们必须是 与我上面所做的单个命令一起使用。然而, ConvertTo-Json 不需要在 commmandLevel 应用,而只是 应用于脚本输出一次。
我的问题是:
1) 我如何仍然使用 convertTo-Json,以便我的所有枚举属性都返回其文本而不是整数,并且复杂对象或数组也不会丢失?在我使用的方法中,复杂的对象会丢失
2) 此外,它应该足够通用,以便它可以在脚本末尾应用,而不是在命令级别
【问题讨论】:
-
不确定您所说的“脚本级”和“命令级”cmdlet 是什么意思;听起来您将某个概念不适当地应用于 PowerShell。如果您对此类概念有任何参考,请提供链接。
-
这基本上是您之前问题的重复:stackoverflow.com/q/44494409/5771128
-
您好,这完全不是重复的,因为它询问如何使用 convertTo-Json 保留复杂的对象。在我之前的问题中,我问过如何将 Enum 值保留为文本而不是整数。
-
我在下面尝试了 cahvers 答案。没有运气,但是我随后尝试了这种方法,它似乎运作良好。 stackoverflow.com/a/54024450/491196
标签: json powershell csv enums