27

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

ie文件看起来像这样:

serverName=serv8496
midasServer=serv8194

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

$MidasServer= (from file midasServer value)

我不知道引用所在的行号。

有什么办法可以做到这一点?

4

4 回答 4

27

是的,读取文件,拆分每一行并将拆分结果分配给 Name 和 Value 参数:

Get-Content file.txt | Foreach-Object{
   $var = $_.Split('=')
   New-Variable -Name $var[0] -Value $var[1]
}
于 2012-09-11T11:08:19.080 回答
15

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

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

因此,如果文本文件仅包含示例中的数据,您可以这样做来创建哈希表

$Path = "C:\temp\test.txt"
$values = Get-Content $Path | Out-String | ConvertFrom-StringData
$values.midasServer

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

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

New-Object -TypeName pscustomobject -Property $values

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

$values = [pscustomobject](Get-Content $Path -Raw | ConvertFrom-StringData)
$values.midasServer
于 2017-04-13T13:28:07.690 回答
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]

}
于 2019-11-05T05:30:16.297 回答
0

这对我来说是成功的:

(输入文件 = 文件名.txt)
[string] $person 'Joe'
[int] $age 50
[datetime] $dob '06/11/1971'

(命令)
获取内容文件名.txt | ForEach-Object {
    $invar = $_.Split(" ").Trim()
    调用表达式 (Invoke-Command -ScriptBlock {
        $($invar[0])+$($invar[1])+'=' +$($invar[2])
        } )
}

如果您知道有一个“值”,它将包含空格,即“人“Joe B”,只需加入这些值,就像这样......

替换为:
        $($invar[0])+$($invar[1])+'='+$($invar[2])

有了这个:
        $($invar[1])+$($invar[2])+'='+ (-join $($invar[3]),$($invar[4]),$($invar [5]))

于 2021-09-13T14:36:41.163 回答