【问题标题】:Powershell retrieving a variable from a text filePowershell从文本文件中检索变量
【发布时间】:2021-09-13 22:57:26
【问题描述】:

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

ie 文件如下所示:

serverName=serv8496
midasServer=serv8194

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

$MidasServer= (from file midasServer value)

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

有什么办法吗?

【问题讨论】:

    标签: powershell


    【解决方案1】:

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

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

    【讨论】:

    • 这对我有用,但我不断收到错误消息,提示无法创建名称,因为它是一个空字符串。这是为什么呢?
    【解决方案2】:

    如果这正是您的文件的显示方式,即用等号表示的键值对列表,那么您应该看看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
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 行尾(windows CRLF vs. linux LF)PS 能同时处理这两种情况吗?
      【解决方案4】:

      这对我来说是成功的:

      (输入文件 = 文件名.txt)
      [字符串] $person '乔'
      [int] $50 岁
      [日期时间] $dob '06/11/1971'

      (命令)
      获取内容文件名.txt | ForEach-对象 {
      $invar = $_.Split(" ").Trim()
      调用表达式(调用命令 -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] ))

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多