如何从文件中读取powershell表

时间:2016-02-01 14:03:40

标签: 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 =  $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输出。

2 个答案:

答案 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写道:“那不是你应该做的方式” ,这是我想首先自己陈述的内容。
但是我想开箱即用并问如果存在:

  • 能够从易于阅读 固定宽度表转换的cmdlet?
  • 一个cmdlet,可让您轻松转换脚本中的嵌入式(对象)表吗?
  • 一个cmdlet可以处理的不仅仅是字符串?

换句话说:难道不是在某些情况下固定宽度SourceTable有时比丑陋的cvsxml桌更有意义吗?

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 GalleryGitHub