Powershell-将字符串拆分为由开始和结束字符串描述的数组

时间:2020-07-01 15:21:55

标签: arrays string powershell split

我有一个多行字符串(来自json),例如

"somekey": "somevalue",
"somekey": "somevalue"
"somekey": [somevalue]
"somekey": somenumber
"somekey": null,

我想将字符串拆分为一个数组,其中每个元素的值可以是somevalue或somenumber的值。 (我实际上是在形成一个数组,其中包含json中出现的每个值的值)

这将产生以下元素值:

somevalue
somevalue
somevalue
somenumber

我玩过以下代码的变体和补充:

$jsonValues = $jsonValues.Split(": ").Split([Environment]::NewLine)

但想知道实现这一目标的最雄辩的方法。

2 个答案:

答案 0 :(得分:3)

这是一个函数,该函数通常通过ConvertFrom-Json使用正确的JSON解析,从JSON文档中提取所有叶子属性值:

# Accepts a JSON string and outputs all leaf property values.
function Get-JsonValue {
  param([Parameter(ValueFromPipeline)] $json)

  begin {
    # Helper function that walks the object graph.
    function walk {
      param($obj)

      # Note: @(...) is used so that scalar $null values aren't ignored.
      foreach ($elem in @($obj)) {
        if ($elem -isnot [System.Management.Automation.PSCustomObject]) { 
          $elem # leaf value -> output
        }
        else {
          # recurse
          foreach ($prop in $elem.psobject.Properties) {
            foreach ($subElem in @($prop.Value)) { walk $subElem }
          }
        }
      }
    }
  }

  process {
    walk ($json | ConvertFrom-Json)
  }

}

# Sample JSON input
$json = @'
  [ { "hi": 11 }, {
    "somekey1": "somevalue1",
    "somekey2": "somevalue2",
    "somekey3": 42,
    "somekey4": [
        "somevalue4.1",
        "somevalue4.2",
        4.42
      ],
    "somekey5": null
  } ]
'@


# Call with the sample string
$json | Get-JsonValue

上面的结果如下:

11
somevalue1
somevalue2
42
somevalue4.1
somevalue4.2
4.42
# $null - not visible

答案 1 :(得分:0)

感谢Lee_Dailey-他的过滤器在将所有值从原始json抓取到数组中时,对我产生了最多的结果。

($InStuff -split [System.Environment]::NewLine).ForEach({$_.Split(':')[-1]}).Trim(' ",][')