A while ago the System Center Virtual Machine Manager team showed me a chart of their cmdlets. It was an Excel spreadsheet which had the VERBs as rows and the NOUNs as columns. I thought that this was a wonderful way to look at the cmdlets. I woke up this morning and decided to write a script which would do something similar. I’ve attached that script which accomplishes that task. In the process, I decided that there is a good general purpose function here but I haven’t figured out what it’s name is so right now I’m just calling it ConvertTo-XXX (I’m open to suggestions). NOTE – the cmdlet requires the latest version of PowerShell (the stuff we released at the PDC) so if you don’t have those bits, you’ll have to wait a few more weeks until CTP3 is available to try it out. Also note that this is using yesterday’s build which may have more cmdlets than the PRE-Beta we release.
I’m experimenting with a few coding practices so some of these may stay and some may go. I’d love any feedback you have on that topic.
PS> .\ConvertTo-XXX -Test Microsoft.PowerShell.Diagnostics
Name Counter WinEvent ---- ------- -------- Export Export-Counter * Get Get-Counter Get-WinEvent Import Import-Counter *
Microsoft.WSMan.Management
Name WSMan WSManAction WSManCredSSP WSManInstance WSManQuickConfig WSManSessionOption ---- ----- ----------- ------------ ------------- ---------------- ------------------ Connect Connect-WSMan * * * * * Disable * * Disable-WSManCredSSP * * * Disconnect Disconnect-WSMan * * * * * Enable * * Enable-WSManCredSSP * * * Get * * Get-WSManCredSSP Get-WSManInstance * * Invoke * Invoke-WSManAction * * * * New * * * New-WSManInstance * New-WSManSessionOption Remove * * * Remove-WSManInstance * * Set * * * Set-WSManInstance Set-WSManQuickConfig * Test Test-WSMan * * * * *
Microsoft.PowerShell.Core
Name Command Console Help History Job Module ModuleManifest ModuleMember Object ---- ------- ------- ---- ------- --- ------ -------------- ------------ ------ Add * * * Add-History * * * * * Clear * * * Clear-History * * * * * Disable * * * * * * * * * Enable * * * * * * * * * Enter * * * * * * * * * Exit * * * * * * * * * Export * Export-Console * * * * * Export-ModuleMember * ForEach * * * * * * * * ForEach-Object Get Get-Command * Get-Help Get-History Get-Job Get-Module * * * Import * * * * * Import-Module * * * Invoke Invoke-Command * * Invoke-History * * * * * New * * * * * New-Module New-ModuleManifest * * Receive * * * * Receive-Job * * * * Register * * * * * * * * * Remove * * * * Remove-Job Remove-Module * * * Set * * * * * * * * * Start * * * * Start-Job * * * * Stop * * * * Stop-Job * * * * Test * * * * * * Test-ModuleManifest * * Unregister * * * * * * * * * Wait * * * * Wait-Job * * * * Where * * * * * * * * Where-Object
Microsoft.PowerShell.Utility
Name Alias Clixml Command Csv Culture Custom Date Debug Default ---- ----- ------ ------- --- ------- ------ ---- ----- ------- Add * * * * * * * * * Clear * * * * * * * * * Compare * * * * * * * * * ConvertFrom * * * ConvertFrom-Csv * * * * * ConvertTo * * * ConvertTo-Csv * * * * * Disable * * * * * * * * * Enable * * * * * * * * * Export Export-Alias Export-Clixml * Export-Csv * * * * * Format * * * * * Format-Custom * * * Get Get-Alias * * * Get-Culture * Get-Date * * Group * * * * * * * * * Import Import-Alias Import-Clixml * Import-Csv * * * * * Invoke * * * * * * * * * Measure * * Measure-Command * * * * * * New New-Alias * * * * * * * * Out * * * * * * * * Out-Default Read * * * * * * * * * Register * * * * * * * * * Remove * * * * * * * * * Select * * * * * * * * * Send * * * * * * * * * Set Set-Alias * * * * * Set-Date * * Sort * * * * * * * * * Start * * * * * * * * * Tee * * * * * * * * * Trace * * Trace-Command * * * * * * Unregister * * * * * * * * * Update * * * * * * * * * Wait * * * * * * * * * Write * * * * * * * Write-Debug *
Microsoft.PowerShell.Host
Name Transcript ---- ---------- Start Start-Transcript Stop Stop-Transcript
Microsoft.PowerShell.Management
WARNING: column "EventLog" does not fit into the display and was removed.
Name ChildItem Computer ComputerMachinePassword ComputerRestore ComputerRestorePoint ComputerSecureChannel Connection Content ---- --------- -------- ----------------------- --------------- -------------------- --------------------- ---------- ------- Add * Add-Computer * * * * * Add-... Checkpoint * Checkpoint-Computer * * * * * * Clear * * * * * * * Clea... Complete * * * * * * * * Convert * * * * * * * * Copy * * * * * * * * Debug * * * * * * * * Disable * * * Disable-ComputerRestore * * * * Enable * * * Enable-ComputerRestore * * * * Get Get-ChildItem * * * Get-ComputerRestorePoint * * Get-... Invoke * * * * * * * * Join * * * * * * * * Limit * * * * * * * * Move * * * * * * * * New * * * * * * * * Pop * * * * * * * * Push * * * * * * * * Register * * * * * * * * Remove * Remove-Computer * * * * * * Rename * Rename-Computer * * * * * * Reset * * Reset-ComputerMachinePassword * * * * * Resolve * * * * * * * * Restart * Restart-Computer * * * * * * Restore * Restore-Computer * * * * * * Resume * * * * * * * * Set * * * * * * * Set-... Show * * * * * * * * Split * * * * * * * * Start * * * * * * * * Stop * Stop-Computer * * * * * * Suspend * * * * * * * * Test * * * * * Test-ComputerSecureChannel Test-Connection * Undo * * * * * * * * Use * * * * * * * * Wait * * * * * * * * Write * * * * * * * *
Microsoft.PowerShell.Security
Name Acl AuthenticodeSignature Credential ExecutionPolicy PfxCertificate SecureString ---- --- --------------------- ---------- --------------- -------------- ------------ ConvertFrom * * * * * ConvertFrom-SecureString ConvertTo * * * * * ConvertTo-SecureString Get Get-Acl Get-AuthenticodeSignature Get-Credential Get-ExecutionPolicy Get-PfxCertificate * Set Set-Acl Set-AuthenticodeSignature * Set-ExecutionPolicy * *
Here is the code for CONVERTTO-XXX.PS1
#requires -version 2.0 param( [Parameter(ParameterSetName="xxx", Mandatory=$true, Position=0)] $InputObject,
[Parameter(ParameterSetName="xxx", Mandatory=$true)] $yProperty,
[Parameter(ParameterSetName="xxx", Mandatory=$true)] $xProperty,
[Parameter(ParameterSetName="xxx")] [ScriptBlock] $CellValue = {"TRUE"},
[Parameter(ParameterSetName="xxx")] $NullValue = "-",
[Parameter(ParameterSetName="TEST", Mandatory=$true)] [Switch] $Test )
function Assert { param( [Parameter(Mandatory=$true, Position=0)] [ScriptBlock]$script, [Parameter(Position=1)] $Message=$null ) if (!(&$script)) { $ThrowAway,$stack = Get-PscallStack $msg = @" ASSERT( $script ) FAILED at $($stack | out-string)
$Message Continue script execution? "@ if ( !($pscmdlet.ShouldContinue($msg, "ASSERT FAILED"))) { exit } } }
function Add-Property { param( [Parameter(Mandatory=$true, Position=0)] [ValidateNotNullOrEmpty()] $obj, [Parameter(Mandatory=$true, Position=1)] [ValidateNotNullOrEmpty()] [String] $prop, [Parameter(Mandatory=$true, Position=2)] $value) Add-Member -InputObject $obj -MemberType NoteProperty -Name $prop -Value $value -Force }
if ($PSCmdlet.ParameterSetName -eq "TEST") { foreach ($snapin in Get-PSSnapin) { Write-output $snapin.Name $InputObject = get-command -PSSnapin $snapin -type Cmdlet |sort noun &$MyInvocation.MyCommand.Path $InputObject -nullValue "*" -YProperty Verb -xProperty Noun -CellValue {$args[0].name}|ft -auto |out-string –stream } exit }
foreach ($group in $InputObject | Group-Object -Property $yProperty |Sort Name) { $outObj = New-Object psobject Add-Property $outObj Name $group.Name foreach ($inObj in $InputObject) { $Xname = $inObj.$xProperty Assert {$Xname } "Property [$XProperty] not found on input object" Assert {$Xname -ne "NAME" } "Cannot have 'Name' as a property" if ($InObj.$yProperty -eq $group.Name) { Add-Property $outObj $Xname (&$CellValue $inObj) }elseif (!$outObj.$XName) { Add-Property $outObj $Xname $nullValue } } Write-Output $outObj }
[11/23 update – Thanks to Richard Siddaway for pointing out that the original version of this script required the script to be in a PATH directory. I modified the script to fix that. If you are a script, this is how you call yourself so you work whether or not your in the same directory or in a PATH directory
&$MyInvocation.MyCommand.Path
]
Enjoy!
Jeffrey Snover [MSFT] Windows Management Partner Architect Visit the Windows PowerShell Team blog at: http://blogs.msdn.com/PowerShell Visit the Windows PowerShell ScriptCenter at: http://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx