将空格转换为表格单元格

时间:2015-01-05 21:01:32

标签: html powershell

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

以下是shell输出产生的内容:

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

1 个答案:

答案 0 :(得分: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