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 通常是可选的,但在函数调用中,如果您想要控制台输出,它可能是必需的。
正如其他答案所示,还有其他方法可以做到这一点。这些只是我认为最直观的方法。