每次产品发布前都可能会做一些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
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!