Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从文件中读取powershell表_Powershell - Fatal编程技术网

如何从文件中读取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.