使用PowerShell从文本文件中检索整数

时间:2018-02-05 01:22:24

标签: powershell

我想使用Windows PowerShell从文本文件中检索一些数字。假设我有一个看起来像这样的文本文件values.txt(我可以根据需要修改它):

foo=100
bar=-3
foobar=-15
asdf=-4

我想在我的名为$bar的PowerShell脚本中添加一个等于数字-3的变量,正如文本文件所说的那样。我该怎么做?

2 个答案:

答案 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

希望这会有所帮助