我有一个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
。
$VPLEX_Clusters = $VPLEX_Clusters -replace ' {1,}', " "
$VPLEX_Clusters | Out-File F:\Scripts\healthcheck\test.html
这会产生以下结果:
正如您所看到的那样,文本没有垂直对齐,难以理解。我想也许我可以将空格转换为新的表格单元格并分别解析每一行?我真的不太确定,我希望有一种更简单的方法将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):
这是最终输出,因为你只能看到产生第一行。
答案 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