powershell 如何将-WhatIf转换为本机命令的开关

mrphzbgm  于 2023-01-26  发布在  Shell
关注(0)|答案(1)|浏览(106)

我的高级脚本(带有[CmdletBinding(SupportsShouldProcess)]属性)调用了一个原生命令,该原生命令支持一个开关,使其以“空运行”模式运行,即只输出将要复制或删除的内容,而不实际执行任何复制/删除操作。
脚本的示例代码:

[CmdletBinding(SupportsShouldProcess)]
param ()
gsutil -m rsync -r -n something gs://something

这里,-n开关打开空运行模式。

如何根据WhatIf开关是否传递给脚本来指定此开关?

根据这篇官方文章,其他cmdlet应该自动继承-WhatIf值,但仍然建议显式地将值传递给cmdlet:但是在调用本机命令时,我认为这种方法不起作用。

a2mppw5e

a2mppw5e1#

正如其他人所评论的那样,当使用-WhatIf参数调用脚本时,可以检查$WhatIfPreference首选项变量,该变量将为$true

[CmdletBinding(SupportsShouldProcess)]
param ()

$dryMode = @( if( $WhatIfPreference ) { '-n' } )
gsutil -m rsync -r @dryMode something gs://something

为了避免重复gsutil命令行,我使用了argument splatting。为了支持splotting,$dryMode必须是一个数组,这是通过数组子表达式运算符@(…)强制的。如果$WhatIfPreference$true,数组将由值为-n的单个字符串组成。否则,数组将为空,并且展开空数组不会不要在命令行中插入任何内容(连空格都不要)。
使用PowerShell 7+,可以使用三元运算符实现更简洁的语法:

$dryMode = $WhatIfPreference ? @('-n') : @()
gsutil -m rsync -r @dryMode something gs://something

相关问题