Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于提取json数据的PowerShell 2.0脚本_Powershell_Powershell 2.0 - Fatal编程技术网

用于提取json数据的PowerShell 2.0脚本

用于提取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&

更新-Powershell 5.1的解决方案非常简单。我单独发布了一个答案”

我正在尝试我的第一个Powershell脚本(Windows 7中的版本2.0)。我正在从一个文件中读取以下json文本(该部分工作正常)。我想获取“public_url”的值。下面的脚本错误为“

作为我第一次使用Powershell,我不太了解如何导航对象。提前感谢,

我的json文件内容:

  {
     "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