如何从文件中读取powershell表
我将此内容保存在一个文件中:如何从文件中读取powershell表,powershell,Powershell,我将此内容保存在一个文件中: File Versions ---- -------- aaa {1.0.0.123, 1.0.0.124} bbb {1.0.0.123, 1.0.0.124} 如何在powershell中将其读入表或键入数组? 我已通过以下脚本创建了该文件: $versions = $dictionary | ForEach-Object{ $properties = @{ File = $
File Versions
---- --------
aaa {1.0.0.123, 1.0.0.124}
bbb {1.0.0.123, 1.0.0.124}
如何在powershell中将其读入表或键入数组?
我已通过以下脚本创建了该文件:
$versions = $dictionary | ForEach-Object{
$properties = @{
File = $dictionary.Key
Versions = $dictionary.Value <# an array of strings #>
}
New-Object PSObject -Property $properties
}
$versions | Out-File "filesVersions.txt"
$versions=$dictionary | ForEach对象{
$properties=@{
File=$dictionary.Key
Versions=$dictionary.Value
}
新对象PSObject-属性$properties
}
$versions |输出文件“filesVersions.txt”
脚本不再使用。这只是为了演示filesVersions.txt
文件中的内容
我实际上想要的是在一个文件中存储一个键值对,其中key是FileName,value是版本列表
我需要不时地读取文件内容,将所有新行或新版本的内容保存到现有行并将其保存回去
我想为它使用格式表
输出 我想对它使用格式表输出。对不起,你不应该这样做。你增加了很多不必要的开销。您所看到的是字符串解析,它可能是不可靠和乏味的
PowerShell的力量来自对象。在这种情况下,使用导出CSV
是理想的选择。但是,您需要对双向的数组执行一些操作
$versions = $dictionary | ForEach-Object{
$properties = @{
File = $dictionary.Key
Versions = $dictionary.Value -join "|"
}
New-Object PSObject -Property $properties
}
$versions | Export-Csv "filesVersions.csv" -NoTypeInformation
当您要将数据导入PowerShell以获取对象时,需要拆分该字段以获取阵列
Import-Csv "filesVersions.csv" | ForEach-Object{
# Update the property
$_.Versions = $_.Versions -split "|"
# Send the updated object down the pipe
$_
}
或者使用计算属性
Import-Csv "filesVersions.csv" | Select-Object File,@{Name="Versions";Expression={$_.Versions -split "|"}}
您也可以使用Export-CLIXML
,而无需执行连接或其他操作。我个人认为这是为了更复杂的输出,而不是你在这里所做的 正如@Matt所写的那样,“这不是你应该做的事情”,这是我自己首先想说的。但我喜欢开箱思考,并质疑如果有:
- 能够从易于阅读的固定宽度表转换的cmdlet李>
- 允许您轻松转换脚本中嵌入(对象)表的cmdlet
- 仅能处理字符串的cmdlet
SourceTable
有时会比丑陋的cvs
或xml
表格更有意义,难道不是吗
convertfromsourcetable
(别名cfst
)能够在无需任何帮助的情况下读取大多数固定宽度的表格。不幸的是,问题中的示例可能不是最好的示例:尽管,convertfromsourcetable
能够将(右对齐)类型还原为整数,但它无法从输出还原奇数数组格式。但是,您可以使用本机解决这部分问题:
ConvertFrom-SourceTable '
File Versions
---- --------
aaa {1.0.0.123, 1.0.0.124}
bbb {1.0.0.123, 1.0.0.124}
' |
Select-Object File, @{n='Versions'; e={$_.Versions.TrimStart('{').TrimEnd('}') -Split '\s*,\s*'}}
有关最新版本的
ConvertFrom SourceTable
,请参阅将格式表
输出保存到文件中的or。你能控制输出吗。解决这个问题比现在重新解析它更容易。或者它实际上是一个CSV文件,您可以使用导入CSV“filesVersions.CSV”
。或者这是一个大文件,这就是为什么要使用ReadAllLines
?什么是$versions
?请参阅我的编辑并提供更多解释。什么是filesVersions.csv或$dictionary并不重要,因为它已经不存在了。这只是我的测试数据,我保存到一个文件中,我想把它读回。@Liero你不能(可靠地)做到这一点-你如何确定{1.0.0.123,1.0.0.124}
是一个数组(可能是版本,IP地址)还是字符串文字“{1.0.0.123,1.0.124}
?正如@Matt所说,首先导出到另一种格式是在现实世界中解决这个问题的方法(例如,Export-CliXml
或Export-Csv
,而不是将格式化输出到Out-File
)。在powershell中保存文件如此容易,并且读回文件相当复杂,这有点奇怪。我正在保存pscustomobjects,但不知道如何读回该表。ConvertFrom SourceTable是这里最直接的解决方案+1.