如何为无原生-WhatIf支持的PowerShell cmdlet实现函数-WhatIf功能
现有脚本
-WhatIf不生效的核心原因 你当前的写法无法让-WhatIf正常工作,存在3个明确问题:
- 仅在函数头声明
[CmdletBinding(SupportsShouldProcess)],只会给函数本身新增-WhatIf、-Confirm参数,不会自动拦截内部调用的无原生WhatIf支持的cmdlet(即你用到的Set-MsolUserLicense)的执行 - 存在变量拼写错误:调用
Set-MsolUserLicense时使用了未定义的$upn变量,正确参数值应为入参$UserPrincipalName - 循环内输出提示时引用了整个许可证数组
$AssignedLicense,而非当前循环项,会导致提示信息错误
正确修改方式
要让不原生支持-WhatIf的cmdlet遵循函数的WhatIf开关,需要在执行实际修改操作前,调用PowerShell内置的$PSCmdlet.ShouldProcess()方法做状态判断,同时修正现有变量错误,完整可运行代码如下:
function Remove-License { [CmdletBinding(SupportsShouldProcess)] param ([String] $UserPrincipalName ) # 将函数的公共参数(如WhatIf、Verbose、ErrorAction)传递给支持该参数的内部查询命令 $AssignedLicense = (Get-MsolUser -UserPrincipalName $UserPrincipalName -ErrorAction Stop).licenses.AccountSkuId $AssignedLicense | ForEach-Object { $currentSku = $_ # 按PowerShell约定传入操作目标、操作名称,自动生成标准WhatIf/Confirm提示 if ($PSCmdlet.ShouldProcess("目标用户: $UserPrincipalName", "操作: 移除许可证 $currentSku")) { Write-Host "Removing $UserPrincipalName License $currentSku..." -ForegroundColor Red # 修正变量名错误,执行实际移除操作 Set-MsolUserLicense -UserPrincipalName $UserPrincipalName -RemoveLicenses $currentSku -Verbose } } } # WhatIf模式测试(不会实际修改配置) Remove-License -UserPrincipalName 'User.Name@domain.com' -WhatIf
运行效果说明
- 携带
-WhatIf参数调用函数时,不会实际执行许可证移除操作,仅输出标准的WhatIf预览提示 - 不携带
-WhatIf参数调用时,会正常执行许可证移除逻辑 - 声明
SupportsShouldProcess后函数会自动支持-Confirm参数,携带该参数运行时每步操作前都会弹出二次确认提示
内容的提问来源于stack exchange,提问作者Senior Systems Engineer
相关产品推荐
相关产品推荐

