- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有两个 Byte[]
类型的变量(我选择这种类型是为了特定的需要,所以它需要保留。)声明为:
$first = New-Object Byte[] 32
$second = New-Object Byte[] 32
并且,我初始化了两个变量的每个索引。
现在,我创建了一个哈希表 $List1
作为:
$List1=@{"First" = $first; "Second" = $second}
我使用以下语法创建 json 文件:
$List1 | ConvertTo-Json | Set-Content -Path $jsonFile1
这是第一个json文件内容:
{
"First": {
"value": [
210,
195,
131,
176,
88,
154,
57,
37,
2,
75,
182,
190,
156,
43,
113,
199,
63,
25,
109,
92,
220,
91,
219,
252,
113,
68,
202,
12,
147,
194,
36,
177
],
"Count": 32
},
"Second": {
"value": [
238,
225,
12,
172,
134,
94,
42,
204,
27,
78,
39,
166,
229,
111,
143,
254
],
"Count": 16
}
}
然后我将第一个 json 文件读取到一个临时变量中,如下所示:
$tempHash = Get-Content -Path $jsonFile1 -Raw| ConvertFrom-Json
由于 $tempHash
是一个 PSCustomObject
,我创建了一个新的哈希表 $List2
,如下所示:
$List2 = @{"First" = $tempHash.First.value; "Second"= $tempHash.Second.value}
我用它来创建第二个 json 文件,如下所示:
$List2 | ConvertTo-Json | Set-Content -Path $jsonFile2
这是第二个json文件内容:
{
"First": [
133,
231,
19,
173,
60,
50,
105,
68,
38,
109,
99,
155,
2,
188,
216,
9,
8,
225,
203,
15,
167,
8,
188,
76,
192,
154,
183,
194,
1,
122,
143,
137
],
"Second": [
27,
3,
57,
67,
155,
145,
181,
194,
250,
10,
65,
90,
41,
230,
243,
196
]
}
我使用相同的语法来创建这两个 json 文件。那么,为什么它们的结构不同呢?
[编辑]
我怀疑,不同之处在于这种语法:
$List1=@{"First" = $first; "Second" = $second}
因为 Byte[]
类型变量不能像简单的 integer[]
类型变量那样工作。纠正我。
[编辑]
所以,事实证明 Byte[]
类型变量有两个不同的键。“值”,它保存实际的字节值数组,以及“Count”,保存 Byte[]
变量中元素的数量。 但是,当我们像这样调用 Byte[]
类型变量时:
$first
它是 Byte[]
类型,我们只得到“value”键下列出的值。 “count”键下的值永远不会显示在控制台中,但它会以某种方式传递给哈希表。
还有一点需要注意。如果我使用:
$List2 = @{"First" = $tempHash.First; "Second"= $tempHash.Second}
然后,我将不得不使用:
$List2.First.Value #to get the value of the "First" key
这让我感到不舒服,因为对于 $List1
哈希表,我只需要使用:
$List1.First #to get the value of the "First" key.
[解决方法]
我创建了一个 hastable $List
作为原始哈希表,如下所示,严格仅一次性使用:
$List | ConvertTo-Json | Set-Content -Path $jsonFile
然后,我从上面的原始 $jsonFile
创建了两个 hastables $List1
和 $List2
,如下所示。
$tempHash = Get-Content -Path $jsonFile -Raw| ConvertFrom-Json
$List1 = @{"First" = $tempHash.First; "Second" = tempHash.Second}
$List2 = @{"First" = $tempHash.First; "Second" = tempHash.Second}
它帮助我在引用它们的键和值时保持一致性。
现在,我用
#to fetch the values of the "First" keys of both hashtables.
$List1.First.value #and
$List2.First.value
同样,我对哈希表 $List1
和 $List2
的“第二”键执行相同的操作。
#to fetch the values of the "Second" keys of both hashtables.
$List1.Second.value #and
$List2.Second.value
[编辑]
事实证明这是我的 Powershell 版本中的一个错误,如下面的 @mklement0 所指出的。完美的解决方案是按照@mklement0 的指示使用以下语法:
# Ensure that the input array is constructed without the extra [psobject] wrapper.
$First = [Byte[]]::new(32)
$Second = [Byte[]]::new(32)
最佳答案
第一个 ConvertTo-Json
调用的结果是 Windows PowerShell v5.1 中的一个怪癖 : 生成的 JSON 应该有 First
和 Second
包含一个数组直接而不是一个对象 和值
和 Count
属性,value
包含数组。
$a = New-Object Byte[] 2; @{ a = $a } | ConvertTo-Json -Compress
产生:
{"a":[0,0]}
在 PowerShell Core v6.0.1 中 - 确定。{"a":{"value":[0,0],"Count":2}}
在 Windows PowerShell v5.1 中 - 损坏。在您的情况下,New-Object
的使用触发了怪癖。
解决方法:
在您的脚本/ session 开始时,运行:
Remove-TypeData System.Array
这从所有数组对象中删除了 ETS 提供的过时的 .Count
属性,这使得 [psobject]
包装的对象(例如返回的对象)的问题消失了New-Object
) - 有关解释,请参阅 this answer我的。
更麻烦的解决方法:
如果您确保 -is [psobject]
不再为输入数组报告 true,问题就会消失,这可以通过以下方式之一完成:
[PSv5+]: $First = [Byte[]]::new(32)
- 使用表达式而不是命令会产生问题走开,因为它不会创建额外的、不可见的 [psobject]
包装器。
[PSv4-]: $First = (New-Object Byte[] 32).psobject.BaseObject
- 显式绕过额外的 [psobject]
包装器让问题消失。
简化示例(PSv5+,但很容易适应早期版本;省略了文件操作,因为它们是问题的附带因素):
# Ensure that the input array is constructed without the extra [psobject] wrapper.
$First = [Byte[]]::new(2)
# Construct a hashtable...
$List1 = @{ First = $first }
# ... and convert it to JSON:
($json = $List1 | ConvertTo-Json)
上面的代码现在正确地产生了(没有具有value
和count
属性的无关对象):
{
"First": [
0,
0
]
}
现在可以按预期将此 JSON 字符串重新转换为对象:
# Re-convert: $tempObj.First then *directly* contains the input array
# (there is no .Value property anymore).
$tempObj = $json | ConvertFrom-Json
# Construct a new hashtable...
$List2 = @{ First = $tempObj.First }
# ... and convert it to JSON.
$List2 | ConvertTo-Json
结果是与上面相同的 JSON 字符串。
关于json - Powershell 两个json内容为什么不一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48841191/
我正在寻找实现 PowerShell 提供程序 在 电源外壳。 我一直在想,如果我只是定义类型,然后将它们导入我的 session (导入模块),我应该能够让它们可用。 例如,这个 不工作但它沿着我想
我创建的脚本使用了组件,这些组件仅在32位版本的Powershell中可用。 默认情况下,Windows使用Powershell x64执行脚本,这会导致一些错误。 是一种在脚本开头设置值以强制Win
是否可以从 Powershell 中检测它是否是嵌套 shell? 如果我打开 Powershell 或 cmd.exe 窗口,然后输入 powershell 在那里,是否有一个神奇的 $host.s
随着 PowerShell Core 的发布,应用程序在使用托管自动化库 (system.management.automation) 时如何选择调用哪个版本的 Powershell(Powershe
最近,我加入了我企业的 Windows 团队,凭借我的开发人员背景(一般是 Java、.NET 和 Web),我很快就对 PowerShell 产生了兴趣。我可以看到它比普通的旧批处理文件、VB 更有
假设我有一个 powershell 脚本,它在我当前路径的相对路径中包含一个 Powershell 哈希。让我们称之为“name.ps1”,它包含: $names = @{ "bob" = "b
我想为我正在构建的自定义 Powershell Commandlet 使用 SqlServerCmdletSnapin。如果我将以下代码添加到 PSM1 的开头: if ( (Get-PSSnapin
如何调用从 PowerShell 脚本中获取命名参数的 PowerShell 脚本? foo.ps1: param( [Parameter(Mandatory=$true)][String]$a=''
我即将为 Windows 管理员编写一个 PowerShell 脚本,以帮助他们完成与部署 Web 应用程序相关的某些任务。 有什么理由让我应该赞成或排除开发 PowerShell 模块 (.psm1
我的 powershell 模块有一个函数,我希望它返回一个非零退出代码。但是,作为一个模块函数,当我运行 Import-Module 时,它会加载到 powershell 控制台的上下文中。所以,当
我在这个问题上花了最后 4 个小时,非常感谢您提供的任何意见。 我需要使用不同的凭据调用 powershell 脚本并将参数传递给该脚本。 安装 WISEScript 中包装的程序后,此脚本开始收集机
我有一个场景,我需要将 powershell 命令的命令和输出转发到另一个进程以进行日志记录和处理。 我希望这个控制台尽可能接近 powershell,因此不希望将它简单地托管在另一个控制台程序中。
我正在尝试让一个主 PowerShell 脚本运行所有其他脚本,同时等待 30-60 秒以确保完成任务。我尝试过的所有其他操作都不会停止/等待第一个脚本及其进程完成,然后才能同时完成所有其他脚本,并且
我正在编写一个脚本来使用多个 plink (PuTTY) session 作为 Windows 版本的 clustersh。然而,我陷入困境,因为我想从 powershell 打开多个 Powersh
我读了这个答案:How to Open Powershell from Powershell start powershell 这将打开基础的大分辨率 PS 实例。如何打开 PS(x86)? 最佳答案
我很想知道我们是否可以在 Powershell 中做到这一点。 使用 Out-File 命令,我们可以通过管道将其输出写入文件。这样我就可以将我所有的历史命令发送到一个文本文件中。 问题是我可以在每次
我在 about_Pipelines 阅读了有关 PowerShell 中的管道工作原理的信息,并了解到管道一次传送一个对象。 所以,这个 Get-Service | Format-Table -Pr
我正在尝试像这样从 powershell 启动一个进程:- $proc = (start-process $myExe -argumentList '/myArg True' -windowStyle
## To run the script # .\get_status.ps1 -Hostname -Service_Action -Service_Name #$Hostname = "hos
让我们使用 powershell 命令 Write-Host "red text"-Fore red这会在红色前景中显示“红色文本”。 但是,您希望文本以稍微亮一点的方式显示字体颜色,浅红色。 有没有
我是一名优秀的程序员,十分优秀!