【发布时间】:2016-04-15 05:18:04
【问题描述】:
我正在编写一个 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 命令,并且它永远不会被执行。相反,它会打印:
如果:对目标“temp\path\to\tmp78A4.tmp”执行“输出到文件”操作
因为这个命令永远不会执行,内部处理也不会发生,并且我的 cmdlet 的其余部分具有实际副作用也不会执行,因为它不知道要使用哪些端口,这使得-WhatIf 在很大程度上没用。
我怎样才能绕过 -WhatIf 这个块而不在 cmdlet 的其余部分覆盖它?
【问题讨论】:
-
我很好奇是否在
$info = [IO.Path]::GetTempFileName()和info-gather.exe 2>$info之间(你要睡觉或暂停片刻)如果临时文件实际存在同时也发送了-WhatIf开关。 -
@gravity,我不确定我是否理解您的评论。
GetTempFileName()创建一个文件并返回其名称,因此当2>$info发生时,保证该文件存在(但保证GetTempFileName不会返回另一个已经存在的文件的名称)。 -
此 cmdlet 是否有
[CmdletBinding(SupportsShouldProcess=$true)]?这个设置如何支持-WhatIf? -
@Matt,是的,这个 cmdlet 有
SupportsShouldProcess=$true。稍后在 cmdlet 中(在“具有严重副作用的严重事情”之后),我使用$PSCmdlet.ShouldProcess。
标签: powershell