针对-Confirm,-Force和-WhatIf

时间:2016-01-12 16:49:55

标签: powershell

Microsoft是否有关于何时向自定义PowerShell cmdlet添加-Confirm-Force-WhatIf参数的官方指南?关于何时/如何使用这些参数似乎没有明确的共识。例如this issue

如果没有正式的指导方针,是否有最佳做法或经验法则可供使用?这是一些更多的背景,我当前(可能有缺陷)的理解:

-WhatIf

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

似乎(但我希望在此处看到更多官方指导)如果您要添加或删除资源,则应添加-WhatIf。 (例如,删除文件。)更新现有资源的操作可能不会从中受益。正确?

-Force

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

  

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

所以对我来说,似乎(再次,我希望这里有一些官方指导)当你遇到cmdlet失败的情况时,你应该添加一个可选的-Force参数,但是可以确信完成行动。

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

-Confirm

如果cmdlet的-Confirm设置为true,则-WhatIf标记会自动添加,如SupportsShouldProcess。在cmdlet中,如果您调用ShouldProcess,系统将提示用户执行操作。如果添加-Confirm标志,则不会出现提示。 (即通过cmdlet调用添加确认。)

每当cmdlet对系统产生重大影响时,-Confirm都应该可用。就像-WhatIf一样,只要添加或删除资源,就应该添加它。

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

  • 何时需要添加-WhatIf / -Confirm
  • 何时需要添加-Force
  • 支持-Confirm-Force
  • 是否有意义?

3 个答案:

答案 0 :(得分:5)

我还没有研究过这些文档是否详细,但以下内容是基于我的观察结果:

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

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

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

  4. ,否则操作将失败

答案 1 :(得分:2)

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

如果您使用:

Get-ChildItem -Recurse | Remove-Item -Recurse -Force -WhatIf

它将产生以下输出:

  

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

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

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

if($Force -or $Pscmdlet.ShouldProcess($)) {
    ...
}

答案 2 :(得分:1)

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

确保已安装模块:

PS E:\> Install-Module -Name 'PsScriptAnalyzer'

然后按如下方式运行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'.

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