2015-01-05 62 views
1

我有一个shell命令我试图使用Powershell将其很好地格式化为HTML。将空格转换为表格单元格

这里是外壳输出产生什么:

enter image description here

我使用下面的代码来解析该部分出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 

这将产生以下:

enter image description here

正如你所看到的文本没有对齐垂直因此很难理解。我在想,也许我可以将空格转换为新的表格单元格,并分别解析出每一行?我真的不太确定,但我希望有一种更简单的方法将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)是从阅读: enter image description here

这里是最终的输出,你可以看到只产生第一行。 enter image description here

+0

你有没有考虑使用ConvertTo-HTML,而不是试图格式化自己的HTML?像'$ VPLEX_Clusters | ConvertTo-HTML | Out-File F:\ Scripts \ healthcheck \ test.html' – TheMadTechnician

+0

@TheMadTechnician问题是输出似乎来自Linux主机('plink'是命令行SSH客户端),所以它是一个字符串“table”,而不是PowerShell对象。 –

+0

@AnsgarWiechers是正确的。虽然我在想也许我可以用逗号替换空格并创建一个CSV文件。然后我可以使用ConvertFrom-CSV自动创建html表格。这会有什么意义吗? – RichT

回答

4

在我看来,你只是想保留纯文本表,而不是创建一个实际的(HTML-)表。如果是这样的话,你可以简单地把$VPLEX_Clusters<pre>标签没有字符串替换:

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

如果你想创建一个实际的<table>我建议只提取无头的数据线,每条线分割成一个数组,并从他们建立自定义对象:

$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 片段(只是一个表,要准确),而不是整个HTML页面。如果你想要一个完整的HTML页面:删除参数-Fragment


EDIT2:对象属性被指定为哈希表,其元素没有特定的顺序。如果你想在一个特定的顺序列,你可以管通过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或更高版本,你也可以指定属性哈希表作为一个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 
+0

它需要是html,因为它是通过电子邮件发送表格和颜色等的大型报告的一部分。 我有点困惑,但认为这是正确的轨道。我已经关闭了标题,并将剩下的两行分隔为单独的变量。它现在将它们打印出来,但我只能弄清楚如何使用1行。我如何将两行添加到表格中? – RichT

+0

@RichT第二个代码示例应该已经生成了包含两行的完整HTML表格。 –

+0

它似乎只使用输出中的第一行并忽略第二行,我将上面的新完整代码与输出一起发布。 – RichT