将空格转换为 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
.
$VPLEX_Clusters = $VPLEX_Clusters -replace ' {1,}', " "
$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
我有一个 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
这会产生以下结果:
如您所见,文本未垂直对齐,因此难以理解。我在想也许我可以将空格转换为新的 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