【问题标题】:How to read powershell table from file如何从文件中读取powershell表
【发布时间】:2016-05-10 00:29:08
【问题描述】:

我在一个文件中有这个内容:

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 文件中的内容。

我真正想要的是在文件中存储一个键值对,其中键是文件名,值是版本列表。

有时我需要读取文件内容、所有新行或现有行的新版本并将其保存回来。

我想为它使用Format-Table 输出。

【问题讨论】:

  • 看起来您已将Format-Table 输出保存到文件中。您是否可以控制该输出。解决这个问题会更容易,然后现在解析它。或者它实际上是一个 CSV 文件,你可以使用Import-CSV "filesVersions.csv"。或者这是一个大文件,这就是你使用ReadAllLines的原因?
  • 什么是$versions
  • 查看我的编辑并提供更多解释。什么是 filesVersions.csv 或 $dictionary 并不重要,因为它不再存在。这只是我的测试数据,我将其保存到一个文件中,我想将其读回。
  • @Liero 你不能(可靠地)这样做 - 你将如何确定 {1.0.0.123, 1.0.0.124} 是代表一个数组(什么?可能是版本、IP 地址)还是字符串文字 "{1.0.0.123, 1.0.0.124}" ?正如@Matt 所说,首先导出为另一种格式是您在现实世界中解决此问题的方法(例如Export-CliXmlExport-Csv,而不是格式化输出到Out-File)。

标签: powershell


【解决方案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,并且您不需要执行连接或任何操作。我个人认为这是为了比你在这里做的更复杂的输出。

【讨论】:

    【解决方案2】:

    “这不是你应该这样做的方式”,正如 @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

    【讨论】:

    • 有点奇怪,在 powershell 中如何如此容易地保存文件,并且相当复杂地读取它们。我正在保存 pscustomobjects,但不知道如何读回表格。 ConvertFrom-SourceTable 是这里最直接的解决方案。 +1
    猜你喜欢
    • 2023-01-26
    • 2013-07-28
    • 1970-01-01
    • 2010-12-21
    • 2018-01-23
    • 2014-01-18
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多