PowerShell从文本文件读取变量

时间:2019-04-29 18:17:50

标签: powershell

我尝试制作一个从外部文件获取变量的程序。我的问题是公司政策不允许用户运行ps1文件(该程序之所以有效,是因为我通过ps2exe将ps1编译为exe文件),因此该外部文件必须为txt,csv或其他纯文本格式。我不想将这些变量刻录到exe中,因为用户需要使用其值的灵活性。

我试图制作一个哈希表,并通过ConvertFrom-StringData将变量放入其中,但这会弄乱输出。

file.txt

one = foo
two = bar

prog.ps1

$variable = Get-Content ".\file.txt" | Out-String | ConvertFrom-StringData
Write-Host $variable.one
Write-Host "$variable.two"

后一个显示为:System.Collections.Hashtable.two而不是$ variable.two的值。当然,在这个简化的示例中,在第二个变量周围并不需要引号,但是该程序在某些地方需要它。

当我将变量及其正确格式存储在ps1文件中,并以正常方式灌入

. .\file.ps1

它的工作方式应该像它应该的那样,但是不能由需要它的用户使用。

对于任何使它起作用的想法,我将不胜感激。我的意思是说是否有可能。

2 个答案:

答案 0 :(得分:0)

您正在执行的操作正在运行,但是对引号变量使用的语法错误。

应该是:

$variable = Get-Content ".\file.txt" | Out-String | ConvertFrom-StringData
Write-Host $variable.one
Write-Host "$($variable.two)"

有关更多信息,请参见this answer

答案 1 :(得分:0)

您的问题仅仅是在可扩展字符串("...")中错误使用插值语法

"$variable.two"本身会扩展$variable ,然后是 literal .two,因为为了嵌入 >表达式在可扩展字符串中,您必须将它们括在$(...) 中,即,在这种情况下,请用"$($variable.two)"-有关PowerShell字符串扩展的摘要,请参见this answer规则。

令人惊讶的是,Write-Host $variable.one-没有包含"..."-成功访问了属性值,因为它是一个 value表达式而不是(隐式)可扩展字符串; this answer详细了解了如何将未加引号的标记解析为命令参数。

也:

  • 如果您在PowerShell v3或更高版本中运行,则Get-Content -Raw... | Out-String更简单,更高效,可以将文本文件的全部内容作为单个多行字符串获取。 / p>

  • 顺便说一句:Write-Host is typically the wrong tool to use,除非意图是只将写到显示,否则绕过成功输出流,并具有将输出发送到其他命令的能力,将其捕获到变量中,然后将其重定向到文件。在PSv5 +中,Write-Host写入information stream,可以捕获其输出 ,但只能通过6>。有关更多信息,请参见this answer的底部。

将它们放在一起:

$variable = Get-Content -Raw .\file.txt | ConvertFrom-StringData

'--- implicit output, to success stream'
$variable.one
$variable.two

'--- explicit to-host output, via expandable string'
write-host $variable.one
write-host "$($variable.two)"  # Note the $(...) around the property access

以上结果:

--- implicit output, to success stream
foo
bar
--- explicit to-host output, via expandable string
foo
bar