【发布时间】:2021-09-13 22:57:26
【问题描述】:
有没有办法读取文本文件 C:\test.txt 并检索特定值?
ie 文件如下所示:
serverName=serv8496
midasServer=serv8194
我想通过这个文件以某种方式在我的脚本中设置一个变量的值,例如:
$MidasServer= (from file midasServer value)
我不知道引用所在的行号。
有什么办法吗?
【问题讨论】:
标签: powershell
有没有办法读取文本文件 C:\test.txt 并检索特定值?
ie 文件如下所示:
serverName=serv8496
midasServer=serv8194
我想通过这个文件以某种方式在我的脚本中设置一个变量的值,例如:
$MidasServer= (from file midasServer value)
我不知道引用所在的行号。
有什么办法吗?
【问题讨论】:
标签: powershell
是的,读取文件,拆分每一行并将拆分结果分配给Name和Value参数:
Get-Content file.txt | Foreach-Object{
$var = $_.Split('=')
New-Variable -Name $var[0] -Value $var[1]
}
【讨论】:
如果这正是您的文件的显示方式,即用等号表示的键值对列表,那么您应该看看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
【讨论】:
这是对 Shay Levy 答案的改进。它执行以下操作。
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]
}
【讨论】:
这对我来说是成功的:
(输入文件 = 文件名.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] ))
【讨论】: