我想使用Windows PowerShell从文本文件中检索一些数字。假设我有一个看起来像这样的文本文件values.txt
(我可以根据需要修改它):
foo=100
bar=-3
foobar=-15
asdf=-4
我想在我的名为$bar
的PowerShell脚本中添加一个等于数字-3
的变量,正如文本文件所说的那样。我该怎么做?
答案 0 :(得分:2)
注意:输入文件看起来像*.ini
文件的一部分;要获得对此类文件的全功能支持,请考虑使用第三方模块,例如PSIni
。
正如Matt在对该问题的评论中建议的那样, ConvertFrom-StringData
听起来像是正确的工具:
# Read the key-value pairs stored in file file.txt into [hashtable] $ht
PS> ($ht = Get-Content -Raw -LiteralPath file.txt | ConvertFrom-StringData)
Name Value
---- -----
foo 100
bar -3
foobar -15
asdf -4
# Access a specific value:
PS> $ht.foo # or: $ht['foo']
100
注意:
ConvertFrom-StringData
返回哈希表,而不是创建个别变量:
如上所示,您必须访问foo
输入行的值为$ht.foo
(或$ht['foo']
),而不是$foo
,例如
要确保只创建单个哈希表,必须使用Get-Content -Raw
(PSv3 +)将整个输入文件作为单个字符串传递
ConvertFrom-StringData
只创建[string]
值,因此如果输入值应被视为数字,例如,手动转换是必需的:
# .Clone() is needed to support enumeration and modification in the same loop.
foreach($key in $ht.Keys.Clone()) { $ht.$key = [int] $ht.$key }
通常,需要考虑更多细微之处,例如\
而不是`
作为转义字符,引号会保留为文字 - 请参阅the docs。
答案 1 :(得分:1)
这应该有效:
$file = "C:\test.txt"
foreach($line in (Get-Content $file)) {
$a = $line.Split("=")
New-Variable -Name $a[0] -Value $a[1]
}
Write-Output ""
Write-Output "Variable Check ::"
Write-Output "foo = $foo"
Write-Output "bar = $bar"
Write-Output "foobar = $foobar"
Write-Output "asdf = $asdf"
如果您不想使用数组,也可以将名称/值放在不同的变量中,只需更改for循环:
$a,$b = $line.Split("=")
New-Variable -Name $a -Value $b
使用ConvertFrom-StringData
的Matts建议:
$line = $line | ConvertFrom-StringData
New-Variable -name $line.Keys -Value $line.Values
希望这会有所帮助