Microsoft是否有关于何时向自定义PowerShell cmdlet添加-Confirm
,-Force
和-WhatIf
参数的官方指南?关于何时/如何使用这些参数似乎没有明确的共识。例如this issue。
如果没有正式的指导方针,是否有最佳做法或经验法则可供使用?这是一些更多的背景,我当前(可能有缺陷)的理解:
-WhatIf
标志显示cmdlet 将执行的操作,而不实际执行任何操作。这对于潜在的不稳定操作的干运行非常有用,可以看到实际结果。如果cmdlet的Cmdlet
属性将SupportsShouldProcess
属性设置为true,则会自动添加该参数。
似乎(但我希望在此处看到更多官方指导)如果您要添加或删除资源,则应添加-WhatIf
。 (例如,删除文件。)更新现有资源的操作可能不会从中受益。正确?
-Force
开关用于声明“我知道我在做什么,我确信我想这样做”。例如,复制文件(Copy-File
)时,-Force
参数表示:
允许cmdlet复制无法以其他方式更改的项目,例如复制只读文件或别名。
所以对我来说,似乎(再次,我希望这里有一些官方指导)当你遇到cmdlet失败的情况时,你应该添加一个可选的-Force
参数,但是可以确信完成行动。
例如,如果您要创建一个新资源,它将破坏具有相同名称的现有资源。 cmdlet的默认行为将报告错误并失败。但是如果添加-Force
,它将继续(并覆盖现有资源)。正确?
如果cmdlet的-Confirm
设置为true,则-WhatIf
标记会自动添加,如SupportsShouldProcess
。在cmdlet中,如果您调用ShouldProcess
,系统将提示用户执行操作。如果添加-Confirm
标志,则不会出现提示。 (即通过cmdlet调用添加确认。)
每当cmdlet对系统产生重大影响时,-Confirm
都应该可用。就像-WhatIf
一样,只要添加或删除资源,就应该添加它。
考虑到我可能不正确的理解,这里有一些我想要具体回答的问题:
-WhatIf
/ -Confirm
?-Force
?-Confirm
和-Force
?答案 0 :(得分:5)
我还没有研究过这些文档是否详细,但以下内容是基于我的观察结果:
您应该使用-WhatIf
进行任何更改。更新是可以从-WhatIf
中受益的更改(例如,如果您想进行大量更新,该怎么办?)。
-Force
表示"强制覆盖现有项目"或"覆盖只读文件系统属性"。在任何一种情况下,操作的成功取决于用户是否具有权限。
-Confirm
和-Force
不是互斥的。例如,您可以确认写入文件的操作,但该文件可能受只读属性的保护。在这种情况下,除非您还指定-Force
。
答案 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