【问题标题】:Powershell hashtable in quotes引号中的 Powershell 哈希表
【发布时间】:2014-07-21 22:29:13
【问题描述】:

在 Powershell 中,我有一个名为 $derivedkey 的哈希表,其中包含 2 个键值对。

我想在这样的双引号内使用哈希表中的值:

write-host "mysalt = $derivedkey['salt']"

但我得到的是:

mysalt = System.Collections.Hashtable['salt']

有没有办法让我可以让 powershell 将 hashmap 评估为值,所以它会返回这个?

mysalt = F668844CD184B7549E00DCBE51274730

【问题讨论】:

    标签: powershell hashmap


    【解决方案1】:

    因为我发现所有这些 $ 符号和括号很痛苦,所以我使用字符串格式化程序:

    "mysalt = {0}" -f $derivedkey['salt'] | Write-Host
    

    【讨论】:

      【解决方案2】:

      您可以将其包装在这样的子表达式中:

      write-host "mysalt = $($derivedkey['salt'])"
      

      否则它会在到达有效变量名的末尾时立即停止,并且 ['salt'] 不是变量名的一部分,因此它试图解释整个哈希表而不仅仅是 'salt' 条目。

      【讨论】:

        【解决方案3】:

        您需要使用子表达式$() 来扩展字符串中的表达式(不是变量)。试试:

        write-host "mysalt = $($derivedkey['salt'])"
        

        【讨论】:

          【解决方案4】:

          简单的串联怎么样。

          "mysalt = " + $derivedkey['salt'] | write-host
          

          【讨论】:

          • 你能改写一下,让它听起来不像一个问题吗?
          【解决方案5】:

          Write-Host 使用引号,引号将字符串作为输入。哈希表不是字符串,因此您必须告诉 PS 在将其解析为字符串之前扩展其内容。

          通常在处理整数和对象时也会发生这种情况。对于这些情况,我个人使用 3 个选项之一:

          1。子表达式

          Write-Host "mysalt = $($derivedkey['salt'])"
          

          $(...) 语法是一个子表达式,这意味着其中的内容首先由 PS 评估,而与它周围的引号无关。当我想保持字符串的连续性以保证代码的易读性时,我喜欢这种方法,例如在路径中,例如"C:/users/me/Programs/$app/$($versionDict[$version])/$lang/lang.xml"

          2。串联

          Write-Host ( 'mysalt = ' + $derivedkey['salt'] )
          

          请注意,这里的哈希表周围没有引号,因此 PS 不会尝试将其评估为字符串,而是正常扩展它。 + 符号将非字符串链接到字符串。括号连接其中的所有内容,并且 write-host 输出连接的对象。您可以在 PowerShell 中以这种方式连接任意数量的项目。

          连接强调代码中的变量可见性,并且使用制表符缩进来对齐常见主题,我发现它可以在多行上创建更清晰的代码:

          Write-Host ( "`n" + 'mysalt  = '    +    $derivedkey['salt']    +    'from key  = '   +    $key    )
          Write-Host ( "`t" + 'forFile = '    +    $filename              +    'in folder = '   +    $folder )
          

          请注意,您必须使用 (<someNumber>).ToString() 方法将整数转换为字符串。

          3。 Here-String

          Write-Host @"
          mysalt = $($myDict['salt'])
          "@
          

          这在技术上与选项 1 相同,因为它涉及将子表达式注入字符串,但在控制台中格式化多行字符串输出更容易。

          对于 here-string,Write-Host 通常是可选的,但在函数调用中,如果您想要控制台输出,它可能是必需的。

          正如其他答案所示,还有其他方法可以做到这一点。这些只是我认为最直观的方法。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-12-21
            • 2011-05-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多