问题描述
我在这里尝试了所有我能想到的方法,但我是 powershell 的新手,但还是一片空白。希望有人能提供帮助。
$appSettings = Invoke-RestMethod -Uri $url -Method Get -Headers $header
如果我将 $appSettings
登录到 powerhsell IDE,我得到:
PS H:\> $appSettings
{
"DetailedErrors": true,"Logging": {
"LogLevel": {
"Default": "Trace","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "information"
}
}
}
但是,我无法访问任何这些属性。
PS H:\> $appSettings.DetailedErrors
什么都不返回...
PS H:\> ConvertTo-Json -InputObject $appSettings
"{\n \"DetailedErrors\": true,\n \"Logging\": {\n \"LogLevel\": {\n \"Default\": \"Trace\",\n
PS H:\> $appSettings.'Logging'
PS H:\> $appSettings | Select -Property Logging
Logging
-------
那么我如何获得 Logging.LogLevel.Default(意思是我想知道它说的是“Trace”)??
更新完整的错误日志
PS H:\> $AppSettinsJson = $appsettings | ConvertFrom-Json
ConvertFrom-Json : Invalid object passed in,':' or '}' expected. (362): {
"DetailedErrors": true,"Microsoft.Hosting.Lifetime": "information"
}
},"connectionStrings": {
"Default": "Something"
},"LockingTimeout": "60",//in seconds,"Major": "1","Minor" : "0","buildDate": "#{buildDate}#",}
At line:1 char:34
+ $AppSettinsJson = $appsettings | ConvertFrom-Json
+ ~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [ConvertFrom-Json],ArgumentException
+ FullyQualifiedErrorId : System.ArgumentException,Microsoft.PowerShell.Commands.ConvertFromJsonCommand
解决方法
这是因为您尝试访问它的方式。
$appsettings 不是您想要使用的。它是返回的 JSON 字符串 $appsettings。
所以,这...
$JsonData = @'
{
"DetailedErrors": true,"Logging": {
"LogLevel": {
"Default": "Trace","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"
}
}
}
'@ | ConvertFrom-Json
$JsonData.DetailedErrors
# Results
<#
True
#>
$JsonData.Logging
# Results
<#
LogLevel
--------
@{Default=Trace; Microsoft=Warning; Microsoft.Hosting.Lifetime=Information}
#>
$JsonData.Logging.LogLevel
# Results
<#
Default Microsoft Microsoft.Hosting.Lifetime
------- --------- --------------------------
Trace Warning Information
#>
所以,如果我重构你所做的。我会这样做:
$appSettings = (Invoke-RestMethod -Uri $url -Method Get -Headers $header) | ConvertFrom-Json
$appSettings.DetailedErrors
# Results
<#
True
#>
$appSettings.Logging
# Results
<#
LogLevel
--------
@{Default=Trace; Microsoft=Warning; Microsoft.Hosting.Lifetime=Information}
#>
$appSettings.Logging.LogLevel
# Results
<#
Default Microsoft Microsoft.Hosting.Lifetime
------- --------- --------------------------
Trace Warning Information
#>
根据您对所用 PS 版本的反应进行更新
*Json cmdlet 仅适用于 PSv5 及更高版本。
# Results
ModuleType Name CmdletName_FinctionName PowerShellVersion
---------- ---- ----------------------- -----------------
Manifest Microsoft.PowerShell.Utility ConvertTo-Json 5.1
Manifest Microsoft.PowerShell.Utility ConvertFrom-Json 5.1
#>
因此是您的错误。
如果您坚持使用 PSv2,那么您可以通过这种方式解析 JSON。
# Another approach in Windows 8 and higher
$jsonObjectClass = [Windows.Data.Json.JsonObject,Windows.Data.Json,ContentType=WindowsRuntime]
($jsonObject = $jsonObjectClass::Parse('{"data":["powershell","rocks"]}'))
$jsonObjectClass = [Windows.Data.Json.JsonObject,ContentType=WindowsRuntime]
($jsonObject = $jsonObjectClass::Parse($JsonData))
更新 - 您也可以将字符串保存到文件中,然后对字符串进行硬解析。
Clear-Host
((Get-Content -LiteralPath 'D:\Temp\appsettings.txt' |
Select-String 'Default' -Context 0) -replace '\s+|\"|,' -split(':'))[1]
# Results
<#
Trace
#>