common.ps1
function DebugMessage($message) { # $threadId = [System.Threading.Thread]::CurrentThread.ManagedThreadId # $appDomainId = [AppDomain]::CurrentDomain.Id # [System.Diagnostics.Debug]::WriteLine("PoshHump: $threadId : $appDomainId :$message") [System.Diagnostics.Debug]::WriteLine("PoshHump: $message") # Add-Content -Path "C:\temp\__test.txt" -Value $message } $source = @" using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; public class CommandSummary { public string Verb { get; set; } public string Suffix { get; set; } public string SuffixHumpForm { get; set; } public string Command { get; set; } } public class Utils { public static CommandSummary ConvertToSummary(string commandName) { int separatorIndex = commandName.IndexOf('-'); if (separatorIndex >= 0) { string verb = commandName.Substring(0, separatorIndex); string suffix = commandName.Substring(separatorIndex + 1); return new CommandSummary { Command = commandName, Verb = verb, Suffix = suffix, SuffixHumpForm = Regex.Replace(suffix, "[a-z]", "") }; } return null; } private class TempKey { public string Verb { get; set; } public string SuffixHumpForm { get; set; } public override int GetHashCode() { unchecked // Overflow is fine, just wrap { int hash = 17; hash = hash * 23 + Verb.GetHashCode(); hash = hash * 23 + SuffixHumpForm.GetHashCode(); return hash; } } public override bool Equals(object o) { TempKey key = o as TempKey; if (key == null) { return false; } return key.Verb == Verb && key.SuffixHumpForm == SuffixHumpForm; } } public static Dictionary<string, Dictionary<string, List<CommandSummary>>> GroupCommands(string[] commandNames) { return commandNames.Select(c => Utils.ConvertToSummary(c)) .Where(o=>o!=null) .GroupBy(c => new TempKey { Verb = c.Verb.ToLowerInvariant(), SuffixHumpForm = c.SuffixHumpForm }) .GroupBy(c => c.Key.Verb) .ToDictionary(g => g.Key.ToLowerInvariant(), g => g.ToDictionary(g2 => g2.Key.SuffixHumpForm, g2 => g2.ToList())) ; } public static string GetWildCardForm(string suffix) { // create a wildcard form of a suffix. E.g. for "AzRGr" return "Az*R*Gr*" if (string.IsNullOrEmpty(suffix)) { return "*"; } int startIndex = 1; string result = suffix[0].ToString(); if (result == "-") { result += suffix[1]; startIndex++; } for (int i = startIndex; i < suffix.Length; i++) { if (char.IsUpper(suffix[i])) { result += "*"; } result += suffix[i]; } result += "*"; return result; } } "@ Add-Type -TypeDefinition $source -Language CSharp function GetCommandWithVerbAndHumpSuffix($commandName) { $separatorIndex = $commandName.IndexOf('-') if ($separatorIndex -ge 0) { $verb = $commandName.SubString(0, $separatorIndex) $suffix = $commandName.SubString($separatorIndex + 1) return [PSCustomObject] @{ "Verb" = $verb "Suffix" = $suffix "SuffixHumpForm" = $suffix -creplace "[a-z]", "" # case sensitive replace "Command" = $commandName } } } function GetCommandsWithVerbAndHumpSuffix() { $rawCommands = Get-Command $commandNames = [string[]]($rawCommands | Select-Object -ExpandProperty Name) return [Utils]::GroupCommands($commandNames) } function GetWildcardForm($suffix) { return [Utils]::GetWildCardForm($suffix) } |