我尝试制作一个从外部文件获取变量的程序。我的问题是公司政策不允许用户运行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
它的工作方式应该像它应该的那样,但是不能由需要它的用户使用。
对于任何使它起作用的想法,我将不胜感激。我的意思是说是否有可能。
答案 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