PowerShell中SupportsShouldProcess的WhatIf行为疑问
问题原因与解决方案
为什么Export-Csv会触发WhatIf提示?
当你的函数通过[CmdletBinding(SupportsShouldProcess)]启用了ShouldProcess支持后,PowerShell会让函数内部调用的所有支持ShouldProcess的cmdlet自动继承当前的WhatIf/Confirm状态。Export-Csv恰好是支持ShouldProcess的cmdlet,所以哪怕它不在if ($PSCmdlet.ShouldProcess(...))的代码块里,也会响应全局的WhatIf参数,只输出提示而不实际写入文件。
让Export-Csv在WhatIf模式下正常执行的方法
直接给Export-Csv加上-WhatIf:$false参数,强制它忽略全局的WhatIf状态,无论函数是否以-WhatIf运行,都会实际写入日志:
修改后的代码片段:
foreach ($f in $filesToMove) { $currAction = "Move File" if ($PSCmdlet.ShouldProcess($f.ServerRelativeUrl, $currAction)) { Move-PnPFile -SourceUrl $f.ServerRelativeUrl -TargetUrl $targetFolderPath -Force } [PSCustomObject]@{ SiteTitle = $subSite.Title SiteURL = $subSite.Url SourceRelativeUrl = $f.ServerRelativeUrl TargetFolderPath = $targetFolderPath Action = $currAction } | Export-Csv -Path $logPath -Append -WhatIf:$false }
额外说明
$PSCmdlet.ShouldProcess(...)的作用只是判断是否执行代码块内的逻辑(比如Move-PnPFile),但它不会改变其他cmdlet的WhatIf状态。如果需要让某个cmdlet不受全局WhatIf/Confirm影响,最直接的方式就是显式指定-WhatIf:$false或-Confirm:$false参数。
内容的提问来源于stack exchange,提问作者pk.
相关产品推荐
相关产品推荐

