powershell 我想通过替换json模板文件中环境变量的值来创建json文件

mjqavswn  于 2022-11-10  发布在  Shell
关注(0)|答案(2)|浏览(123)

我的一个要求是-使用WINDOWS,不要使用AWS CLI或WINDOWS中尚未提供的任何工具。例如,我有一个包含以下内容的json文件Test.json:
"My number is $myvar"
我将这段代码读入PowerShell变量,如下所示:

$myobj=(get-content .\test.json | convertfrom-json)

$myvar=1

从这里开始,我想用$myobj做一些事情,使我能够获得以下输出:

$myobj | tee json_with_values_from_environment.json
My number is 1

我在IEX上取得了一些有限的成功,但不确定它是否可以用于本例

bakd9h0s

bakd9h0s1#

您可以使用$ExecutionContext.InvokeCommand.ExpandString()

$myobj = '{test: "My number is $myvar"}' | ConvertFrom-Json
$myvar = 1
$ExecutionContext.InvokeCommand.ExpandString($myobj.test)

输出

My number is 1
lhcgjxsq

lhcgjxsq2#

以下是使用Parser查找所有VariableExpressionAst并用会话中的值替换它们的一种方法。
给定以下test.json

{
  "test1": "My number is $myvar",
  "test2": {
    "somevalue": "$env:myothervar",
    "someothervalue": "$anothervar !!"
  }
}

我们希望使用当前会话中定义的相应值查找并替换$myvar$myothervar$anothervar,因此代码如下所示(请注意,我们在将Json字符串转换为对象之前进行替换,这种方式要容易得多):

using namespace System.Management.Automation.Language

$isCore7 = $PSVersionTable.PSVersion -ge '7.2'

# Define the variables here

$myvar = 10
$env:myothervar = 'hello'
$anothervar = 'world'

# Read the Json

$json = Get-Content .\test.json -Raw

# Now parse it

$ast = [Parser]::ParseInput($json, [ref] $null, [ref] $null)

# Find all variables in it,  and enumerate them

$ast.FindAll({ $args[0] -is [VariableExpressionAst] }, $true) |
    Sort-Object { $_.Extent.Text } -Unique | ForEach-Object {
        # now replace the text with the actual value
        if($isCore7) {
            # in PowerShell Core is very easy
            $json = $json.Replace($_.Extent.Text, $_.SafeGetValue($true))
            return
        }
        # in Windows PowerShell not so much
        $varText = $_.Extent.Text
        $varPath = $_.VariablePath

        # find the value of the var (here we use the path)
        $value = $ExecutionContext.SessionState.PSVariable.GetValue($varPath.UserPath)
        if($varPath.IsDriveQualified) {
            $value = $ExecutionContext.SessionState.InvokeProvider.Item.Get($varPath.UserPath).Value
        }
        # now replace the text with the actual value
        $json = $json.Replace($varText, $value)
    }

# now we can safely convert the string to an object

$json | ConvertFrom-Json

如果我们将其转换回Json以查看结果:

{
  "test1": "My number is 10",
  "test2": {
    "somevalue": "hello",
    "someothervalue": "world !!"
  }
}

相关问题