Powershell:如何实现标准交换机?

bwe*_*rks 15 debugging powershell passthru command-line-arguments verbose

对于像-WhatIf这样的东西,我们有[CmdletBinding]属性给我们的$ PSCmdlet.ShouldProcess().是否有其他此类工具或实践来实现常见的命令行参数,如-Verbose,-Debug,-PassThru等?

Ryn*_*ant 15

Write-Debug并自动Write-Verbose处理-Debug-Verbose参数.

-PassThru 从技术上讲,它不是一个常见的参数,但您可以像下面这样实现它:

function PassTest {
    param(
        [switch] $PassThru
    )
    process {
        if($PassThru) {$_}
    }
}

1..10|PassTest -PassThru
Run Code Online (Sandbox Code Playgroud)

这是在cmdlet上使用函数的PassThru值的示例:

function Add-ScriptProperty {
    param(
        [string] $Name,
        [ScriptBlock] $Value,
        [switch] $PassThru
    )
    process{
        # Use ":" to explicitly set the value on a switch parameter
        $_| Add-Member -MemberType ScriptProperty -Name $Name -Value $Value `
            -PassThru:$PassThru 
    }
}

$calc = Start-Process calc -PassThru|
        Add-ScriptProperty -Name SecondsOld `
            -Value {((Get-Date)-$this.StartTime).TotalSeconds} -PassThru
sleep 5
$calc.SecondsOld
Run Code Online (Sandbox Code Playgroud)

请查看Get-Help about_CommonParameters更多信息.

  • 是的,'PassTest`不是一个有用的功能; 这只是一个简单的例子来说明如何实现`-PassThru`.另外,你也可以对输入变量做一些事情,但是保持原始值不变(例如`$ _ .Kill(); if($ PassThru){$ _}`).我添加了一个使用PassThru参数来设置另一个命令的PassThru的非繁琐示例. (2认同)