【问题标题】:How to store 1 output from one script to another?如何将一个脚本的 1 个输出存储到另一个脚本?
【发布时间】:2019-05-14 05:31:12
【问题描述】:

假设我有script1.ps1,代码如下:

Function Renew_Token($token) {
    $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
    $headers.Add("X-Vault-Token", $token)
    $response = Invoke-RestMethod  -method POST -uri "https://vault.com:8243/v1/auth/token/renew-self" -ContentType 'application/json' -headers $headers
    $response| ConvertTo-Json  -depth 100
}
Function getValues($token) {
    $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
    $headers.Add("X-Vault-Token", $token)
    $response = Invoke-RestMethod  -method GET -uri "https://vault.com:8243/v1/secret/vault/development" -ContentType 'application/json' -headers $headers
    $response.data| ConvertTo-Json  -depth 100
}
Renew_Token $token
write-host "token renewed!"
write-host "Vault Values:"
getValues $token

这给了我这样的回应:

{
    "request_id":  "ghgdf5-yuhgt886-gfd76trfd",
    "lease_id":  "",
    "renewable":  false,
    "lease_duration":  0,
    "data":  null,
    "wrap_info":  null,
    "warnings":  null,
    "auth":  {
                 "client_token":  "i657ih4rbg68934576y",
                 "accessor":  "t543qyt54y64y654y",
                 "policies":  [
                                  "default",
                                  "vault"
                              ],
                 "token_policies":  [
                                        "default",
                                        "vault"
                                    ],
                 "metadata":  null,
                 "lease_duration":  2000,
                 "renewable":  true,
                 "entity_id":  ""
             }
}
token renewed!
Vault Values:
{
    "abc":  "1234",
    "def":  "897",
    "klm":  "something12"
}

现在考虑一个Script2.ps1,我叫script1

$second_response = & ".\Script1.ps1"

当然,$second_response 会将上面的 2 个响应存储为输出。

如何将第二个响应作为键/值存储在 Script2 的表中?即这部分:

{
    "abc":  "1234",
    "def":  "897",
    "klm":  "something12"
}

$HashTable = @{ }
$HashTable.Add($second_response.key, $second_response.value)

换句话说,$second_response 变量应该只存储这个输出:

{
    "abc":  "1234",
    "def":  "897",
    "klm":  "something12"
}

注意:第二个响应是相当动态的。这意味着在不同的环境中可能有不同的值。因此,我希望能够动态存储此响应中的任何内容,而不是对值进行硬编码

另外,我需要脚本 1 中的 2 个响应,因为我将 script1 用于其他目的,例如说我只想查看保管库内容。 script2 将对来自 script1 的响应进行操作,因此为了方便和灵活,我将它们分开

更新:根据@kuzimoto 的建议,我删除了输出并将响应从 JSON 转换回,我从 Script2 获得了这个输出:

abc:  1234
def:  897
klm:  something12

【问题讨论】:

    标签: powershell


    【解决方案1】:

    我还不能发表评论,但这里有几种可能性:

    1. 编辑 script1.ps1

    您没有提及是否需要第一组结果。如果不这样做,只需从 Renew_Token 函数中删除或注释掉这一行 $response| ConvertTo-Json -depth 100

    1. 将 script1.ps1 的输出解析为 json

    您将 script1 的输出作为纯文本传递给 script2。只需将$second_response = & ".\Script1.ps1" 更改为$second_response = & ".\Script1.ps1" | ConvertFrom-Json。然后,当您想要访问第二个响应时,请使用 $second_response[1],因为这两组 JSON 都会添加到自定义 PS 对象中,并且可以像访问数组一样单独访问。

    【讨论】:

    • 如果我在 script1 中有一些 writehosts 怎么办,例如:令牌更新! JSON会被单独识别吗?如果我使用这种方式: $second_response = & ".\Script1.ps1" | ConvertFrom-Json ?换句话说,是否只存储 JSON 片段?
    • 另外,我将它们作为两个单独的脚本的原因是因为假设我想运行 script1 只是为了查看。 script2 将有一些操作我将应用于 script1 的响应,所以这就是为什么我将它们分开,这就是为什么我没有注释掉响应 1 的输出,以便脚本方便地用于除 script2 之外的其他事情
    • 不幸的是,它会尝试将 Script1 的所有输出转换为 JSON,所以它可能会出错。
    • 是的 :/ 刚刚尝试过,但它出错了:ConvertFrom-Json : Invalid JSON primitive: Renewing。除了注释掉我拥有的所有其他输出之外,有没有办法解决这个问题?我真的很努力地处理了一些输出解释,哈哈,如果我不得不将它们注释掉,那就太可惜了:(
    • 此时,您可以尝试将您的函数单独分离到一个文件中,然后将它们导入到Script1和Script2中,这样您就可以调用您需要的函数而无需额外的东西。
    猜你喜欢
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多