用于提取json数据的PowerShell 2.0脚本
更新-Powershell 5.1的解决方案非常简单。我单独发布了一个答案” 我正在尝试我的第一个Powershell脚本(Windows 7中的版本2.0)。我正在从一个文件中读取以下json文本(该部分工作正常)。我想获取“public_url”的值。下面的脚本错误为“ 作为我第一次使用Powershell,我不太了解如何导航对象。提前感谢, 我的json文件内容:用于提取json数据的PowerShell 2.0脚本,powershell,powershell-2.0,Powershell,Powershell 2.0,更新-Powershell 5.1的解决方案非常简单。我单独发布了一个答案” 我正在尝试我的第一个Powershell脚本(Windows 7中的版本2.0)。我正在从一个文件中读取以下json文本(该部分工作正常)。我想获取“public_url”的值。下面的脚本错误为“ 作为我第一次使用Powershell,我不太了解如何导航对象。提前感谢, 我的json文件内容: { "tunnels":[ { "name&
{
"tunnels":[
{
"name":"command_line",
"uri":"/api/tunnels/command_line",
"public_url":"tcp://8.tcp.ngrok.io:12716",
"proto":"tcp",
"config":{
"addr":"localhost:32400",
"inspect":false
},
"metrics":{
"conns":{
"count":0,
"gauge":0,
"rate1":0,
"rate5":0,
"rate15":0,
"p50":0,
"p90":0,
"p95":0,
"p99":0
},
"http":{
"count":0,
"rate1":0,
"rate5":0,
"rate15":0,
"p50":0,
"p90":0,
"p95":0,
"p99":0
}
}
}
],
"uri":"/api/tunnels"
}
function ConvertFrom-Json20([object] $item){
add-type -assembly system.web.extensions
$ps_js=new-object system.web.script.serialization.javascriptSerializer
#The comma operator is the array construction operator in PowerShell
return ,$ps_js.DeserializeObject($item)
}
$content = get-content -path "c:\path\to\json.txt"
$json = ConvertFrom-Json20($content)
$url = $json | select -expand tunnels | select public_url
echo "url=>" $url
我的Powershell脚本:
{
"tunnels":[
{
"name":"command_line",
"uri":"/api/tunnels/command_line",
"public_url":"tcp://8.tcp.ngrok.io:12716",
"proto":"tcp",
"config":{
"addr":"localhost:32400",
"inspect":false
},
"metrics":{
"conns":{
"count":0,
"gauge":0,
"rate1":0,
"rate5":0,
"rate15":0,
"p50":0,
"p90":0,
"p95":0,
"p99":0
},
"http":{
"count":0,
"rate1":0,
"rate5":0,
"rate15":0,
"p50":0,
"p90":0,
"p95":0,
"p99":0
}
}
}
],
"uri":"/api/tunnels"
}
function ConvertFrom-Json20([object] $item){
add-type -assembly system.web.extensions
$ps_js=new-object system.web.script.serialization.javascriptSerializer
#The comma operator is the array construction operator in PowerShell
return ,$ps_js.DeserializeObject($item)
}
$content = get-content -path "c:\path\to\json.txt"
$json = ConvertFrom-Json20($content)
$url = $json | select -expand tunnels | select public_url
echo "url=>" $url
继续我的评论。 只需升级到最新的WinPS使用JSON cmdlet,不要尝试重新发明轮子 Windows管理框架5.1 Windows管理框架5.1包括对Windows的更新 PowerShell、Windows PowerShell所需状态配置(DSC), Windows远程管理(WinRM)、Windows管理检测 (WMI)。发行说明: 根据您的评论进行更新 使用上述方法,您可以通过点引用和/或索引导航JSON对象
$JsonData = '
{
"tunnels":[
{
"name":"command_line",
"uri":"/api/tunnels/command_line",
"public_url":"tcp://8.tcp.ngrok.io:12716",
"proto":"tcp",
"config":{
"addr":"localhost:32400",
"inspect":false
},
"metrics":{
"conns":{
"count":0,
"gauge":0,
"rate1":0,
"rate5":0,
"rate15":0,
"p50":0,
"p90":0,
"p95":0,
"p99":0
},
"http":{
"count":0,
"rate1":0,
"rate5":0,
"rate15":0,
"p50":0,
"p90":0,
"p95":0,
"p99":0
}
}
}
],
"uri":"/api/tunnels"
}
' |
ConvertFrom-Json
$JsonData
# Results
<#
tunnels uri
------- ---
{@{name=command_line; uri=/api/tunnels/command_line; public_url=tcp://8.tcp.ngrok.io:12716; proto=tcp; config=; metrics=}} /api/tunnels
#>
$JsonData.tunnels
# Results
<#
name : command_line
uri : /api/tunnels/command_line
public_url : tcp://8.tcp.ngrok.io:12716
proto : tcp
config : @{addr=localhost:32400; inspect=False}
metrics : @{conns=; http=}
#>
$JsonData.uri
# Results
<#
/api/tunnels
#>
$JsonData.uri.Split('/')
# Results
<#
api
tunnels
#>
$JsonData.uri.Split('/')[-1]
# Results
<#
tunnels
#>
$JsonData='1〕
{
“隧道”:[
{
“名称”:“命令行”,
“uri”:“/api/隧道/命令行”,
“公共url”:tcp://8.tcp.ngrok.io:12716",
“proto”:“tcp”,
“配置”:{
“地址”:“本地主机:32400”,
“检查”:错误
},
“指标”:{
“康涅狄格州”:{
“计数”:0,
“仪表”:0,
“比率1”:0,
“比率5”:0,
“比率15”:0,
“p50”:0,
“p90”:0,
“p95”:0,
“p99”:0
},
“http”:{
“计数”:0,
“比率1”:0,
“比率5”:0,
“比率15”:0,
“p50”:0,
“p90”:0,
“p95”:0,
“p99”:0
}
}
}
],
“uri”:“/api/隧道”
}
' |
从Json转换
$JsonData
#结果
$JsonData.tunnels
#结果
$JsonData.uri
#结果
$JsonData.uri.Split(“/”)
#结果
$JsonData.uri.Split('/')[-1]
#结果
至于你的东西。。。嗯,它从来不是一个物体。只是一根线
这不像你想的那样有效
function ConvertFrom-Json20([object] $item)
{
Add-Type -Assembly System.Web.Extensions
$ps_js = New-Object System.Web.Script.Serialization.JavascriptSerializer
return
$ps_js.DeserializeObject($item)
}
($content = Get-Content -path 'D:\Scripts\json.txt')
($json = ConvertFrom-Json20($content))
# Results
<#
Nothing is returned
#>
# So this would never work
# Results
<#
$url = $json | select -expand tunnels | select public_url
echo "url=>" $url
#>
函数ConvertFrom-Json20([object]$item)
{
添加类型-Assembly System.Web.Extensions
$ps_js=新对象System.Web.Script.Serialization.JavascriptSerializer
返回
$ps_js.DeserializeObject($item)
}
($content=Get content-path'D:\Scripts\json.txt')
($json=ConvertFrom-Json20($content))
#结果
#所以这是行不通的
#结果
所以,只需读取数据并获取字符串
(Get-Content -path 'D:\Scripts\json.txt').Trim() |
Select-String -Pattern 'uri.*'
# Results
<#
"uri":"/api/tunnels/command_line",
"uri":"/api/tunnels"
#>
((Get-Content -path 'D:\Scripts\json.txt').Trim() |
Select-String -Pattern 'uri.*')[-1] -replace '"' -split('/')
# Results
<#
uri:
api
tunnels
#>
(((Get-Content -path 'D:\Scripts\json.txt').Trim() |
Select-String -Pattern 'uri.*')[-1] -replace '"' -split('/'))[-1]
# Results
<#
tunnels
#>
(获取内容-路径'D:\Scripts\json.txt').Trim()
选择字符串-模式“uri.*”
#结果
((获取内容-路径'D:\Scripts\json.txt').Trim()
选择字符串-Pattern'uri.*')[-1]-替换'''-split('/'))
#结果
(((获取内容-路径'D:\Scripts\json.txt').Trim()
选择字符串-Pattern'uri.*')[-1]-替换'''-split('/'))[-1]
#结果
要从该JSON文件中获取对象,在PSv2中,您可以说执行如下操作
[void][System.Reflection.Assembly]::LoadWithPartialName('System.Web.Extensions')
$JsonData = Get-Content -Path 'D:\Scripts\Json.txt'
$Serializer = New-Object System.Web.Script.Serialization.JavaScriptSerializer
($JsonObject = $Serializer.DeserializeObject($JsonData))
# Results
<#
Key Value
--- -----
tunnels {System.Collections.Generic.Dictionary`2[System.String,System.Object]}
uri /api/tunnels
#>
[void][System.Reflection.Assembly]::LoadWithPartialName('System.Web.Extensions'))
$JsonData=获取内容-路径“D:\Scripts\Json.txt”
$Serializer=新对象System.Web.Script.Serialization.JavaScriptSerializer
($JsonObject=$Serializer.DeserializeObject($JsonData))
#结果
或者这样
($JsonObject = New-Object PSObject -Property $Serializer.DeserializeObject($JsonData))
# Results
<#
tunnels uri
------- ---
{System.Collections.Generic.Dictionary`2[System.String,System.Object]} /api/tunnels
#>
($JsonObject=New Object PSObject-Property$Serializer.DeserializeObject($JsonData))
#结果
。。。然后点参考
$JsonObject.tunnels
# Results
<#
Key Value
--- -----
name command_line
uri /api/tunnels/command_line
public_url tcp://8.tcp.ngrok.io:12716
proto tcp
config {[addr, localhost:32400], [inspect, False]}
metrics {[conns, System.Collections.Generic.Dictionary
#>
$JsonObject.uri
# Results
<#
/api/tunnels
#>
$JsonObject.tunnels
#结果
$JsonObject.uri
#结果
下面是使用Powershell 5.1的简单答案
$json = get-content -path "c:\path\to\json.txt" | ConvertFrom-Json
$url = $json.tunnels.public_url
WIn7上的PS新手,如果这是您的个人计算机,为什么不升级到PS5x,这是Windows Powershell的最新版本?MS已声明这是最后一个版本,但在可预见的将来,它将出现在所有未来的操作系统版本中,就像cmd.exe一样。跨平台PowerShell核心(目前为v7)是未来的核心,并定期更新。Windows PowerShell今天是什么样子,将永远是什么样子。PowerShell Core不是Windows PowerShell的升级或替换。它是在Windows上并行安装的,也可以在Linux和OSX上运行,并且是M365/Azure使用的。WInPS依赖于完整的Windows.Net平台,PowerShell Core仅使用.Net Core。WinPSv5/PSCore已经有内置的JSON cmdlet。所以,不要过分强调那些不再受支持的旧PS,它们确实应该在系统上被禁用。我很高兴升级到PS5x。我的理解是,函数
ConvertFrom-Json20
是一个polyfill,因此我最终将处理同一个对象。对的因此,是否应该url=$json |选择-扩展隧道|选择公共url
与PS5x一起使用?作为一个新的工具是可以的,但您确实应该首先花时间在PowerShell的整体上提高速度。Youtube是你的朋友。至于使用JSON或其他的Powershell,请参阅我的更新。一旦我访问了点引用,这就相当简单了。谢谢-这节省了很多时间!不用担心,很高兴它有帮助。
$json = get-content -path "c:\path\to\json.txt" | ConvertFrom-Json
$url = $json.tunnels.public_url