每次产品发布前都可能会做一些PowerShell相关的Test pass。而我拿到的测试用例是一张Excel表格,大约是根据Get-Command | select Name |ConvertTo-Csv | Out-File cases.csv 这段命令导出的。
经过多次测试后,我发现有两个需要改进的地方:
- 用户更希望同一类命令放在一起,如Get-Location,Pop-Location,Push-Location等。
- 同一类命令尽量按照用户习惯排序,如New->Add->Set->Start->Stop->Remove,这样不至于用户轮到测试Stop时,发现已经将目标对象给Remove了,这样他不得不又得创建一个。
接下来要考虑格式的问题了,csv格式貌似不支持跨行跨列。Powershell 通过 com对象操纵excel可以做到,但是不方便,另外性能也跟不上。最终选择了HTML格式,因为HTML格式可以非常方便地复制进Excel等Office软件。

最后就贴出脚本:
$priorityTable=@{
New=0;
Add=1;
Get=2;
Set=3;
Rename=4;
Test=5;
Start=6;
Stop=7;
Restart=8;
Enable=9;
Disable=10;
Remove=99;
Delete=100;
Default=50
}
$tableTemplate = @"
<table border='1'>
<thead>
<th>Feature</th><th>Cmdlets</th>
</thead>
<tbody>
{0}
</tobdy>
</table>
"@
<#
# Sort cmdlets by verb according to the habits of users
#>
function Sort-CmdletsByVerb([System.Management.Automation.CommandInfo[]]$cmdlets){
$cmdlets | ForEach-Object {
$priority = $priorityTable[$_.Verb]
if( $priority -eq $null ) { $priority = $priorityTable["Default"] }
$_ = $_ | Add-Member "Priority" -Value $priority -MemberType NoteProperty -Force
}
$cmdlets | Sort-Object Priority
}
$htmlStr = new-object Text.StringBuilder
Get-Command -Module "Hyper-V" | Group-Object noun | ForEach-Object {
if($_.Count -gt 1)
{
$cmdlets= Sort-CmdletsByVerb -cmdlets $_.Group | select -ExpandProperty name
#append first row
$htmlStr.AppendFormat("<tr><td rowspan='{0}'>{1}</td><td>{2}</td></tr>",
$_.Count,$_.Name,$cmdlets[0]) | Out-Null
#append remaining rows
$cmdlets[1..$cmdlets.Length] | ForEach-Object {
$htmlStr.AppendFormat("<tr><td>{0}</td></tr>",$_)} | Out-Null
}
else
{
$htmlStr.AppendFormat("<tr><td>{0}</td><td>{1}</td></tr>",$_.Name , $_.Group[0].Name) | Out-Null
}
}
$tableTemplate -f $htmlStr.ToString() | Out-File report.html
本文链接: https://www.pstips.net/export-cmdlets-as-html-format.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
