PowerShell:不要在 -Whatif 上执行特定代码

PowerShell:不要在 -Whatif 上执行特定代码

有没有办法在执行-whatif标志时忽略某一行?

SupportsShouldProcess在 .psm1 模块中添加命令后,-whatif在目标函数上执行时会出错。

受影响的代码片段基本上是试图确定 $Path 是否已设置,如果尚未设置,它将检查是否可以使用给定的名称作为路径:

function New-pallet {
[CmdletBinding(SupportsShouldProcess, ConfirmImpact='Low')]
param([string]Name, [string]Path)
if (!($Path)) {
    if (Test-Path "..\$Name") {
        if ((get-location).Path -eq (Resolve-Path "..\$Name").Path) {
            $Path = "..\$Name"
        } else {
            $Path = ".\$Name"
        }
    } else {
        $Path = ".\$Name"
    }
}
if (!(Test-Path $Path)) {
    New-Item $Path -ItemType Directory -Force | Out-Null
}
}

现在的问题是,当运行 what if 时,它会在 resolve-Path 上出错:

C:\Users\some_user> New-Pallet -Name test -whatif

随后的错误:

Resolve-Path : Cannot find path 'C:\Users\some_user\test' because it does not exist.
At C:\Users\some_user\Projects\some_project.psm1:255 char:72
+ ... MemberType NoteProperty -Name "Path" -Value (Resolve-Path $Path).Path
+                                                  ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (C:\Users\some_user\Projects\someproject\test:String) [Resolve-Path], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.ResolvePathCommand

不使用 -whatif 执行时,resolve-path 可以正常工作

有没有办法在使用该-whatif标志时忽略此行?
或者有一种方法可以检查 -whatif 是否正在被使用?

答案1

事实证明,这$pscmdlet.ShouldProcess正是魔法所在。

更多信息请见此处:https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.cmdlet.shouldprocess?view=powershellsdk-1.1.0

相关内容