Powershell从文本文件中检索变量

use*_*604 22 powershell

有没有办法读取文本文件C:\ test.txt并检索特定值?

即文件看起来像这样:

serverName=serv8496
midasServer=serv8194
Run Code Online (Sandbox Code Playgroud)

我想以某种方式从这个文件中设置我的脚本中变量的值,例如:

$MidasServer= (from file midasServer value)
Run Code Online (Sandbox Code Playgroud)

我不知道引用的行号.

有什么办法吗?

Sha*_*evy 21

是,读取文件,拆分每一行并将拆分结果分配给名称和值参数:

Get-Content file.txt | Foreach-Object{
   $var = $_.Split('=')
   New-Variable -Name $var[0] -Value $var[1]
}
Run Code Online (Sandbox Code Playgroud)


Mat*_*att 9

如果这正是您的文件显示的方式,即用等号表示的键值对列表,那么您应该看看ConvertFrom-StringData哪个

将包含一个或多个键和值对的字符串转换为哈希表.因为每个键/值对必须在一个单独的行上,所以here-strings通常用作输入格式.

因此,如果文本文件仅包含示例中的数据,则可以执行此操作以创建哈希表

$Path = "C:\temp\test.txt"
$values = Get-Content $Path | Out-String | ConvertFrom-StringData
$values.midasServer
Run Code Online (Sandbox Code Playgroud)

哪里$values.midasServer有值serv8194.无需知道属性相对于文件的位置.您的输入文件也可以在等号周围具有不同的前导和尾随空格,这将给出完全相同的结果.

根据您的使用情况,您可以更进一步,并从该哈希表中创建自定义对象

New-Object -TypeName pscustomobject -Property $values
Run Code Online (Sandbox Code Playgroud)

如果您至少拥有PowerShell v3或更高版本,则可以简化该过程(假设您需要自定义的psobject)

$values = [pscustomobject](Get-Content $Path -Raw | ConvertFrom-StringData)
$values.midasServer
Run Code Online (Sandbox Code Playgroud)


Yas*_*haB 7

这是对 Shay Levy 答案的改进。它执行以下操作。

  1. 在开始处理文件之前,它会忽略 file.txt 中的注释行和新行。因此它解决了无法创建名称的错误,因为它是一个空字符串。
  2. 它仅在第一次出现字符“=”时拆分。因此,您可以在值字段中使用任何字符。
  3. 它执行 Trim() 操作以从变量/属性的开头和结尾删除空格字符。因此,file.txt 中的“VARIABLE=VALUE”和“VARIABLE = VALUE”返回相同。
  4. 将新变量的范围设置为“脚本”。在脚本范围内创建的变量只能在创建它们的脚本文件或模块内访问。其他选项是全局、本地和私有。您可以在此处找到可变作用域参考。
Get-Content file.txt | Where-Object {$_.length -gt 0} | Where-Object {!$_.StartsWith("#")} | ForEach-Object {

    $var = $_.Split('=',2).Trim()
    New-Variable -Scope Script -Name $var[0] -Value $var[1]

}
Run Code Online (Sandbox Code Playgroud)