针对-Confirm,-Force和-WhatIf的PowerShell准则

Chr*_*ith 10 powershell

有没有从微软何时添加任何正式指引-Confirm,-Force以及-WhatIf自定义PowerShell命令参数?关于何时/如何使用这些参数似乎没有明确的共识.例如这个问题.

在没有正式指导方针的情况下,是否有最佳实践或经验法则?这是一些更多的背景,我目前(可能有缺陷)的理解:

-如果

-WhatIf标志显示cmdlet 不实际执行任何操作的情况下执行的操作.这对于潜在的不稳定操作的干运行非常有用,可以看到实际结果.如果cmdlet的Cmdlet属性的SupportsShouldProcess属性设置为true,则会自动添加该参数.

看起来好像(但我希望在这里看到更多的官方指导),-WhatIf如果你要添加或删除资源,你应该添加.(例如删除文件.)更新现有资源的操作可能不会从中受益.对?

-力

-Force开关用于声明"我知道我在做什么,我确信我想这样做".例如,复制文件(Copy-File)时,-Force参数表示:

允许cmdlet复制无法以其他方式更改的项目,例如复制只读文件或别名.

所以对我来说,似乎(再次,我喜欢这里的一些官方指导),-Force当你遇到cmdlet失败的情况时,你应该添加一个可选参数,但可以说服它完成动作.

例如,如果您要创建一个新资源,它将破坏具有相同名称的现有资源.cmdlet的默认行为将报告错误并失败.但是如果你添加-Force它将继续(并覆盖现有资源).对?

-确认

如果cmdlet 设置为true,则会-Confirm自动添加该标志.在cmdlet中,如果您调用,则会提示用户执行操作.如果添加了标志,则不会有提示.(即通过cmdlet调用添加确认.)-WhatIfSupportsShouldProcessShouldProcess-Confirm

因此,-Confirm只要cmdlet对系统有很大影响,就应该可用.就像这样,-WhatIf只要添加或删除资源,就应该添加.

考虑到我可能不正确的理解,这里有一些我想要具体回答的问题:

  • 什么时候应该添加-WhatIf/ -Confirm
  • 什么时候需要添加-Force
  • 它曾经是有意义的支持-Confirm-Force

Bil*_*art 5

我还没有研究文档是否详细,但以下是基于我的观察:

  1. 你应该使用-WhatIf任何改变的东西.更新是可以从中受益的更改-WhatIf(例如,如果您想进行大量更新,该怎么办?).

  2. -Force表示"强制覆盖现有项"或"覆盖只读文件系统属性".在任何一种情况下,动作的成功取决于用户是否具有权限.

  3. -Confirm-Force不是相互排斥的.例如,您可以确认写入文件的操作,但该文件可能受只读属性的保护.在这种情况下,除非您还指定,否则操作将失败-Force.


oɔɯ*_*ɯǝɹ 5

作为补充观察,-Force它不应否决-WhatIf。或者换句话说:-WhatIf他优先于-Force

如果您使用:

Get-ChildItem -Recurse | Remove-Item -Recurse -Force -WhatIf
Run Code Online (Sandbox Code Playgroud)

它将产生以下输出:

如果:在目标“E:\some directory”上执行“删除目录”操作。

-Force即使指定了,它也不会实际删除这些项目。

这意味着你永远不应该写:

if($Force -or $Pscmdlet.ShouldProcess($)) {
    ...
}
Run Code Online (Sandbox Code Playgroud)


oɔɯ*_*ɯǝɹ 5

如果您想验证这些通用参数的实现是否符合准则(例如,Set-Xxx cmdlet 应该具有 -Confirm 和 -WhatIf),那么您可以使用 Excellent 模块PsScriptAnalyzer(基于代码分析)。

确保模块已安装:

PS E:\> Install-Module -Name 'PsScriptAnalyzer'
Run Code Online (Sandbox Code Playgroud)

然后运行PowerShell代码分析,如下所示:

PS E:\> Invoke-ScriptAnalyzer -Path . | FL

RuleName : PSUseShouldProcessForStateChangingFunctions
Severity : Warning 
Line     : 78 
Column   : 10 
Message  : Function 'Update-something' has verb that could change system state. 
           Therefore, the function has to support 'ShouldProcess'.
Run Code Online (Sandbox Code Playgroud)

文档(和来源)可以在 GitHub 上找到: https ://github.com/PowerShell/PSScriptAnalyzer

  • @Vijay:https://github.com/PowerShell/PSScriptAnalyzer;或者将 VSCode (https://code.visualstudio.com/) 与捆绑 PSScriptAnalyzer 的 Powershell 扩展 (https://github.com/PowerShell/vscode-powershell) 结合使用。 (2认同)