我在文件中有这个内容:
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"
该脚本不再使用。它仅用于演示filesVersions.txt
文件中的内容。
我真正想要的是将密钥值对存储在文件中,其中key是FileName,Value是版本列表。
我需要不时地将文件内容,所有新行或新版本读取到现有行并保存回来。
我想使用Format-Table
输出。
答案 0 :(得分:1)
我想使用Format-Table输出。抱歉,这不是你应该这样做的方式。您正在增加许多不必要的开销。你正在寻找可以不可靠和繁琐的字符串解析。
PowerShell的力量来自对象。在这种情况下使用Export-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 "|"}}
与Mathias says一样,您也可以使用Export-CLIXML
,而无需进行加入或任何操作。我个人认为那是为了更复杂的输出,那么你在这里做什么。
答案 1 :(得分:0)
@Matt写道:“那不是你应该做的方式” ,这是我想首先自己陈述的内容。
但是我想开箱即用并问如果存在:
换句话说:难道不是在某些情况下固定宽度SourceTable
有时比丑陋的cvs
或xml
桌更有意义吗?
ConvertFrom-SourceTable
ConvertFrom-SourceTable
(别名为cfst
)能够在无需任何帮助的情况下读取大多数固定宽度的表格。不幸的是,问题中的示例可能不是最好的示例:尽管ConvertFrom-SourceTable
能够还原(右对齐)类型,例如整数,则无法从Format-Table
输出中恢复奇数数组格式。不过,您可以使用本地Select-Object
解决问题的这一部分:
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
的最新版本,请参见PowerShell Gallery或GitHub