将空格转换为 table 个单元格

Convert spaces to table cells

我有一个 shell 命令,我正在尝试使用 Powershell 很好地格式化为 HTML。

这是 shell 输出的结果:

我正在使用以下代码从 shell 命令中解析该部分并插入 <br> 标记以创建 HTML 友好输出。

$VPLEX = plink 192.168.10.10 -l admin -pw password ./health
$regex = '(?ms)Clusters:(.+?)Meta Data:'
$VPLEX = $VPLEX -join "<br>"
$VPLEX_Clusters = [regex]::Matches($VPLEX,$regex) | foreach {$_.groups[1].value}

然后我尝试使用此代码将空格换成其他东西,我最初考虑的是制表符(就像文字处理器会处理它一样)但现在我正在使用 4 &nbsp;.

$VPLEX_Clusters = $VPLEX_Clusters -replace ' {1,}', "&nbsp;&nbsp;&nbsp;&nbsp;"

$VPLEX_Clusters | Out-File F:\Scripts\healthcheck\test.html

这会产生以下结果:

如您所见,文本未垂直对齐,因此难以理解。我在想也许我可以将空格转换为新的 table 单元格并单独解析每一行?不过我真的不太确定,我希望有一种更简单的方法将 shell 输出转换为 HTML 而不会丢失原始间距。

编辑 (新代码,对齐但只使用第一行)

$VPLEX = plink 192.168.10.10 -l admin -pw password ./health
$regex = '(?ms)Clusters:(.+?)Meta Data:'
$VPLEX = $VPLEX -join "`r`n"
$VPLEX_Clusters = [regex]::Matches($VPLEX,$regex) | foreach {$_.groups[1].value}


$VPLEX_Clusters | Out-File F:\Scripts\healthcheck\Vplex.txt
(gc F:\Scripts\healthcheck\Vplex.txt | select -Skip 5) | sc F:\Scripts\healthcheck\cluster1.txt

$Vcluster1 = [IO.File]::ReadAllText("F:\Scripts\healthcheck\cluster1.txt")

$html = $Vcluster1 | % {
  $cluster = $_ -split ' +'
  New-Object -Type PSCustomObject -Property @{
    'Clustername' = $cluster[0]
    'Cluster ID'  = [int]$cluster[1]
    'State'       = $cluster[2]
    'Health'      = $cluster[3]
    'Connected'   = [convert]::ToBoolean($cluster[4])
    'Expelled'    = [convert]::ToBoolean($cluster[5])
    'Local-com'   = $cluster[6]
  }
} | ConvertTo-Html -Fragment 

$html | Out-File F:\Scripts\healthcheck\test.html
Invoke-Expression F:\Scripts\healthcheck\test.html

这是从以下位置读取的文本文件 (cluster1.txt):

这是最终输出,如您所见,只生成了第一行。

在我看来,您只想保留明文 table,而不是创建实际的 (HTML-)table。如果是这种情况,您可以简单地将 $VPLEX_Clusters 放入 <pre> 标签中,而无需替换字符串:

...
$VPLEX_Clusters = [regex]::Matches($VPLEX, $regex) | % {$_.groups[1].value}
"<pre>$VPLEX_Clusters</pre>" | Out-File 'F:\Scripts\healthcheck\test.html'

如果你想创建一个实际的 <table> 我建议只提取没有 headers 的数据行,将每一行拆分成一个数组并构建自定义 objects来自他们:

$VPLEX_Clusters = @"
cluster-1  1  ok  ok  True  False  ok
cluster-2  2  ok  ok  True  False  ok
"@ -split "`n"

$VPLEX_Clusters | % {
  $cluster = $_ -split ' +'
  New-Object -Type PSCustomObject -Property @{
    'Clustername' = $cluster[0]
    'Cluster ID'  = [int]$cluster[1]
    'State'       = $cluster[2]
    'Health'      = $cluster[3]
    'Connected'   = [convert]::ToBoolean($cluster[4])
    'Expelled'    = [convert]::ToBoolean($cluster[5])
    'Local-com'   = $cluster[6]
  }
} | ConvertTo-Html -Fragment

编辑: 除非万不得已,否则不要使用中间文件(提示:在这种情况下您不需要)。替换为:

$VPLEX_Clusters | Out-File F:\Scripts\healthcheck\Vplex.txt
(gc F:\Scripts\healthcheck\Vplex.txt | select -Skip 5) | sc F:\Scripts\healthcheck\cluster1.txt

$Vcluster1 = [IO.File]::ReadAllText("F:\Scripts\healthcheck\cluster1.txt")

有了这个:

$Vcluster1 = $VPLEX_Clusters -split "`r`n" | select -Skip 5 |
             ? { $_ -notmatch '^\s*$' }

另请注意,ConvertTo-Html -Fragment 仅创建一个 HTML 片段 (确切地说,只是一个 table),而不是整个 HTML 页。如果您想要整个 HTML 页面:删除参数 -Fragment.


Edit2: object 属性被指定为 hashtables,其元素没有特定的顺序。如果您想要特定顺序的列,您可以通过 select 语句将循环输出与您想要的顺序的属性进行管道传输:

$html = $Vcluster1 | % {
  $cluster = $_ -split ' +'
  New-Object -Type PSCustomObject -Property @{
    'Clustername' = $cluster[0]
    'Cluster ID'  = [int]$cluster[1]
    'State'       = $cluster[2]
    'Health'      = $cluster[3]
    'Connected'   = [convert]::ToBoolean($cluster[4])
    'Expelled'    = [convert]::ToBoolean($cluster[5])
    'Local-com'   = $cluster[6]
  }
} | select 'Clustername', 'Cluster ID', 'State', 'Health', 'Connected',
           'Expelled', 'Local-com' |
    ConvertTo-Html -Fragment

如果您有 PowerShell v3 或更新版本,您还可以将属性 hashtable 指定为 ordered hashtable:

$html = $Vcluster1 | % {
  $cluster = $_ -split ' +'
  $hash = [ordered]@{
    'Clustername' = $cluster[0]
    'Cluster ID'  = [int]$cluster[1]
    'State'       = $cluster[2]
    'Health'      = $cluster[3]
    'Connected'   = [convert]::ToBoolean($cluster[4])
    'Expelled'    = [convert]::ToBoolean($cluster[5])
    'Local-com'   = $cluster[6]
  }
  New-Object -Type PSCustomObject -Property $hash
} | ConvertTo-Html -Fragment