gpt4 book ai didi

powershell - 如何从 -WhatIf 处理中排除 block ?

转载 作者:行者123 更新时间:2023-12-03 11:37:44 25 4
gpt4 key购买 nike

我正在编写一个 Powershell cmdlet,它需要执行命令并将其 stderr 输出存储到临时文件以供以后处理。此输出列出了 cmdlet 稍后可能使用的 COM 端口。

# mostly side-effect-free information gathering
$info = [IO.Path]::GetTempFileName()
info-gather.exe 2>$info
Get-Content $info | ForEach-Object {
# processing
}
Remove-Item $info

# serious things with serious side effects start here

我希望这个 cmdlet 实现 -WhatIf因为它会产生非平凡的副作用。然而, -WhatIf行为接管 info-gather.exe命令,它根本不会被执行。相反,它打印:

What if: Performing the operation "Output to File" on target "temp\path\to\tmp78A4.tmp"



因为这个命令永远不会执行,内部处理也不会发生,我的其余有实际副作用的 cmdlet 没有执行,因为它不知道使用哪个端口,使得 -WhatIf基本上没用。

如何绕过 -WhatIf对于这个块而不在 cmdlet 的其余部分覆盖它?

最佳答案

您可以使用 try...finally设置然后重置 $WhatIfPreference variable .

$script:oldWhatIfPrefernence = $WhatIfPreference
try {
$WhatIfPreference = $false

$info = [IO.Path]::GetTempFileName()
info-gather.exe 2>$info
Get-Content $info | ForEach-Object {
# processing
}
Remove-Item $info
} finally {
$WhatIfPreference = $script:oldWhatIfPreference
}

如果您没有使用 2>重定向,还有一种方法。您可以通过 -WhatIf显式切换到许多 cmdlet 并覆盖 -WhatIf就那部分。
Remove-Item $info -WhatIf:$false

虽然, zneak's answer不涉及临时文件也很优雅。

关于powershell - 如何从 -WhatIf 处理中排除 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36291735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com