Skip to content

Instantly share code, notes, and snippets.

@davegreen
Created April 19, 2017 21:42
Show Gist options
  • Save davegreen/02487224a8371918520db05235033de7 to your computer and use it in GitHub Desktop.
Save davegreen/02487224a8371918520db05235033de7 to your computer and use it in GitHub Desktop.
Register-ArgumentCompleter -CommandName Set-MsolUser -ParameterName UsageLocation -ScriptBlock {
Param(
$commandName, #The command calling this argument completer.
$parameterName, #The parameter currently active for the argument completer.
$currentContent, #The current data in the prompt for the parameter specified above.
$commandAst, #The full AST for the current command.
$fakeBoundParameters #A hashtable of the current parameters on the prompt.
)
$UsageLocations = @{
'Afghanistan' = 'AF'
'Aland Islands' = 'AX'
'Albania' = 'AL'
'Algeria' = 'DZ'
'American Samoa' = 'AS'
'Andorra' = 'AD'
'Angola' = 'AO'
'Anguilla' = 'AI'
'Antarctica' = 'AQ'
'Antigua and Barbuda' = 'AG'
'Argentina' = 'AR'
'Armenia' = 'AM'
'Aruba' = 'AW'
'Australia' = 'AU'
'Austria' = 'AT'
'Azerbaijan' = 'AZ'
'Bahamas' = 'BS'
'Bahrain' = 'BH'
'Bangladesh' = 'BD'
'Barbados' = 'BB'
'Belarus' = 'BY'
'Belgium' = 'BE'
'Belize' = 'BZ'
'Benin' = 'BJ'
'Bermuda' = 'BM'
'Bhutan' = 'BT'
'Bolivia' = 'BO'
'Bonaire, Sint Eustatius and Saba' = 'BQ'
'Bosnia and Herzegovina' = 'BA'
'Botswana' = 'BW'
'Bouvet Island' = 'BV'
'Brazil' = 'BR'
'British Indian Ocean Territory' = 'IO'
'Brunei Darussalam' = 'BN'
'Bulgaria' = 'BG'
'Burkina Faso' = 'BF'
'Burundi' = 'BI'
'Cabo Verde' = 'CV'
'Cambodia' = 'KH'
'Cameroon' = 'CM'
'Canada' = 'CA'
'Cayman Islands' = 'KY'
'Central African Republic' = 'CF'
'Chad' = 'TD'
'Chile' = 'CL'
'China' = 'CN'
'Christmas Island' = 'CX'
'Cocos (Keeling) Islands' = 'CC'
'Colombia' = 'CO'
'Comoros' = 'KM'
'Congo' = 'CG'
'Congo (DRC)' = 'CD'
'Cook Islands' = 'CK'
'Costa Rica' = 'CR'
"Cote d'Ivoire" = 'CI'
'Croatia' = 'HR'
'Cuba' = 'CU'
'Curacao' = 'CW'
'Cyprus' = 'CY'
'Czech Republic' = 'CZ'
'Denmark' = 'DK'
'Djibouti' = 'DJ'
'Dominica' = 'DM'
'Dominican Republic' = 'DO'
'Ecuador' = 'EC'
'Egypt' = 'EG'
'El Salvador' = 'SV'
'Equatorial Guinea' = 'GQ'
'Eritrea' = 'ER'
'Estonia' = 'EE'
'Ethiopia' = 'ET'
'Falkland Islands (Malvinas)' = 'FK'
'Faroe Islands' = 'FO'
'Fiji' = 'FJ'
'Finland' = 'FI'
'France' = 'FR'
'French Guiana' = 'GF'
'French Polynesia' = 'PF'
'French Southern Territories' = 'TF'
'Gabon' = 'GA'
'Gambia' = 'GM'
'Georgia' = 'GE'
'Germany' = 'DE'
'Ghana' = 'GH'
'Gibraltar' = 'GI'
'Greece' = 'GR'
'Greenland' = 'GL'
'Grenada' = 'GD'
'Guadeloupe' = 'GP'
'Guam' = 'GU'
'Guatemala' = 'GT'
'Guernsey' = 'GG'
'Guinea' = 'GN'
'Guinea-Bissau' = 'GW'
'Guyana' = 'GY'
'Haiti' = 'HT'
'Heard Island and McDonald Islands' = 'HM'
'Holy See (Vatican City State)' = 'VA'
'Honduras' = 'HN'
'Hong Kong' = 'HK'
'Hungary' = 'HU'
'Iceland' = 'IS'
'India' = 'IN'
'Indonesia' = 'ID'
# Not currently available as a usage location in Office 365 # 'Iran (the Islamic Republic of)' = 'IR'
'Iraq' = 'IQ'
'Ireland' = 'IE'
'Isle of Man' = 'IM'
'Israel' = 'IL'
'Italy' = 'IT'
'Jamaica' = 'JM'
'Japan' = 'JP'
'Jersey' = 'JE'
'Jordan' = 'JO'
'Kazakhstan' = 'KZ'
'Kenya' = 'KE'
'Kiribati' = 'KI'
# Not currently available as a usage location in Office 365 # "Korea (the Democratic People's Republic of)" = 'KP'
'Korea, Republic of' = 'KR'
'Kuwait' = 'KW'
'Kyrgyzstan' = 'KG'
"Lao People's Democratic Republic" = 'LA'
'Latvia' = 'LV'
'Lebanon' = 'LB'
'Lesotho' = 'LS'
'Liberia' = 'LR'
'Libya' = 'LY'
'Liechtenstein' = 'LI'
'Lithuania' = 'LT'
'Luxembourg' = 'LU'
'Macao' = 'MO'
'Macedonia, the former Yugoslav Republic of' = 'MK'
'Madagascar' = 'MG'
'Malawi' = 'MW'
'Malaysia' = 'MY'
'Maldives' = 'MV'
'Mali' = 'ML'
'Malta' = 'MT'
'Marshall Islands' = 'MH'
'Martinique' = 'MQ'
'Mauritania' = 'MR'
'Mauritius' = 'MU'
'Mayotte' = 'YT'
'Mexico' = 'MX'
'Micronesia' = 'FM'
'Moldova' = 'MD'
'Monaco' = 'MC'
'Mongolia' = 'MN'
'Montenegro' = 'ME'
'Montserrat' = 'MS'
'Morocco' = 'MA'
'Mozambique' = 'MZ'
# Not currently available as a usage location in Office 365 # 'Myanmar' = 'MM'
'Namibia' = 'NA'
'Nauru' = 'NR'
'Nepal' = 'NP'
'Netherlands' = 'NL'
'New Caledonia' = 'NC'
'New Zealand' = 'NZ'
'Nicaragua' = 'NI'
'Niger' = 'NE'
'Nigeria' = 'NG'
'Niue' = 'NU'
'Norfolk Island' = 'NF'
'Northern Mariana Islands' = 'MP'
'Norway' = 'NO'
'Oman' = 'OM'
'Pakistan' = 'PK'
'Palau' = 'PW'
'Palestine, State of' = 'PS'
'Panama' = 'PA'
'Papua New Guinea' = 'PG'
'Paraguay' = 'PY'
'Peru' = 'PE'
'Philippines' = 'PH'
'Pitcairn' = 'PN'
'Poland' = 'PL'
'Portugal' = 'PT'
'Puerto Rico' = 'PR'
'Qatar' = 'QA'
'Reunion' = 'RE'
'Romania' = 'RO'
'Russian Federation' = 'RU'
'Rwanda' = 'RW'
'Saint Barthelemy' = 'BL'
'Saint Helena, Ascension and Tristan da Cunha' = 'SH'
'Saint Kitts and Nevis' = 'KN'
'Saint Lucia' = 'LC'
'Saint Martin' = 'MF'
'Saint Pierre and Miquelon' = 'PM'
'Saint Vincent and the Grenadines' = 'VC'
'Samoa' = 'WS'
'San Marino' = 'SM'
'Sao Tome and Principe' = 'ST'
'Saudi Arabia' = 'SA'
'Senegal' = 'SN'
'Serbia' = 'RS'
'Seychelles' = 'SC'
'Sierra Leone' = 'SL'
'Singapore' = 'SG'
'Sint Maarten' = 'SX'
'Slovakia' = 'SK'
'Slovenia' = 'SI'
'Solomon Islands' = 'SB'
'Somalia' = 'SO'
'South Africa' = 'ZA'
'South Georgia and the South Sandwich Islands' = 'GS'
'South Sudan ' = 'SS'
'Spain' = 'ES'
'Sri Lanka' = 'LK'
'Sudan' = 'SD'
'Suriname' = 'SR'
'Svalbard and Jan Mayen' = 'SJ'
'Swaziland' = 'SZ'
'Sweden' = 'SE'
'Switzerland' = 'CH'
'Syrian Arab Republic' = 'SY'
'Taiwan' = 'TW'
'Tajikistan' = 'TJ'
'Tanzania' = 'TZ'
'Thailand' = 'TH'
'Timor-Leste' = 'TL'
'Togo' = 'TG'
'Tokelau' = 'TK'
'Tonga' = 'TO'
'Trinidad and Tobago' = 'TT'
'Tunisia' = 'TN'
'Turkey' = 'TR'
'Turkmenistan' = 'TM'
'Turks and Caicos Islands' = 'TC'
'Tuvalu' = 'TV'
'Uganda' = 'UG'
'Ukraine' = 'UA'
'United Arab Emirates' = 'AE'
'United Kingdom' = 'GB'
'United States' = 'US'
'United States Minor Outlying Islands' = 'UM'
'Uruguay' = 'UY'
'Uzbekistan' = 'UZ'
'Vanuatu' = 'VU'
'Venezuela, Bolivarian Republic of' = 'VE'
'Viet Nam' = 'VN'
'Virgin Islands, British' = 'VG'
'Virgin Islands, U.S.' = 'VI'
'Wallis and Futuna' = 'WF'
'Western Sahara*' = 'EH'
'Yemen' = 'YE'
'Zambia' = 'ZM'
'Zimbabwe' = 'ZW'
}
$PartialMatches = $UsageLocations.Values.Where({ ($_ -like "$($currentContent)*") })
$PartialMatches | ForEach-Object {
$CompletionText = $_
#Expensive... Causes intellisense to time out sometimes on first use for a full search. I will make this completer more efficient at some point.
$Item = $UsageLocations.Keys | Where-Object { $UsageLocations[$_] -eq $CompletionText }
if ($_ -match '\s') {
$CompletionText = "'$_'"
}
New-Object System.Management.Automation.CompletionResult (
$CompletionText, #Completion text that will show up on the command line.
"$($_) ($Item)", #List item text that will show up in intellisense.
'ParameterValue', #The type of the completion result.
"$($_) ($Item)" #The tooltip info that will show up additionally in intellisense.
)
}
}
Register-ArgumentCompleter -CommandName Get-MsolUser, Set-MsolUser -ParameterName UserPrincipalName -ScriptBlock {
Param(
$commandName, #The command calling this argument completer.
$parameterName, #The parameter currently active for the argument completer.
$currentContent, #The current data in the prompt for the parameter specified above.
$commandAst, #The full AST for the current command.
$fakeBoundParameters #A hashtable of the current parameters on the prompt.
)
if (TestMsolConnection) {
$UserData = @{
SearchString = $currentContent
EnabledFilter = 'All'
}
if ($($fakeBoundParameters.Keys) -contains 'TenantId') {
$UserData.Add('TenantId', $($fakeBoundParameters.TenantId))
}
$Users = Get-MsolUser @UserData
$Users | ForEach-Object {
$CompletionText = $_.UserPrincipalName
if ($_.UserPrincipalName -match '\s') {
$CompletionText = "'$($_.UserPrincipalName)'"
}
New-Object System.Management.Automation.CompletionResult (
$CompletionText, #Completion text that will show up on the command line.
"$($_.UserPrincipalName) ($($_.DisplayName)) ($($Tenant.Name))", #List item text that will show up in intellisense.
'ParameterValue', #The type of the completion result.
"$($_.UserPrincipalName) ($($_.DisplayName)) ($($Tenant.Name))" #The tooltip info that will show up additionally in intellisense.
)
}
}
}
Register-ArgumentCompleter -CommandName Get-MsolUser, Set-MsolUser -ParameterName TenantId -ScriptBlock {
Param(
$commandName, #The command calling this argument completer.
$parameterName, #The parameter currently active for the argument completer.
$currentContent, #The current data in the prompt for the parameter specified above.
$commandAst, #The full AST for the current command.
$fakeBoundParameters #A hashtable of the current parameters on the prompt.
)
if (TestMsolConnection) {
$Customers = Get-MsolPartnerContract | Where-Object TenantId -Like "$currentContent*"
$Customers | ForEach-Object {
$CompletionText = $_.TenantId
if ($_.TenantId -match '\s') {
$CompletionText = "'$($_.TenantId)'"
}
New-Object System.Management.Automation.CompletionResult (
$CompletionText, #Completion text that will show up on the command line.
"$($_.TenantId) ($($_.Name)) ($($_.DefaultDomainName))", #List item text that will show up in intellisense.
'ParameterValue', #The type of the completion result.
"$($_.TenantId) ($($_.Name)) ($($_.DefaultDomainName))" #The tooltip info that will show up additionally in intellisense.
)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment