Function Invoke-Choco { param( [ValidateSet('install','upgrade','uninstall','list','sources')] [string]$verb, [ValueFromRemainingArguments] $varargs ) $modifiedVarArgs = @() foreach ($varArg in $varargs) { if ($varArg.StartsWith('--')) { # skip the first hyphen $varArg = $varArg.Substring(1) } $modifiedVarArgs += $varArg } switch ($verb) { 'install' 'upgrade' { Invoke-ChocoUpgradeCommand @modifiedVarArgs } } } Function Invoke-ChocoUpgradeCommand { param ( [switch]$skipDependencies, [switch]$skipScripts, [string]$Version [ValueFromRemainingArguments] $packageIds ) # List of operations # Verify package exists on feed (at version or get latest) # Move an existing package from /lib to /lib-bkp # Download a package to /lib-tmp # Extract package to /lib # on failure, move /lib-tmp to /lib-bad # on failure, move /lib-bkp to /lib # ADD: ping home that package got installed # BONUS: I don't have to fucking be goddamn singlethreaded for logging } Set-Alias -Name choco -Value Invoke-Choco