改进代码以在PowerShell中使用可选的switch参数

时间:2015-06-11 08:08:53

标签: powershell powershell-v3.0

我有一个包含 Invoke-WebRequest 的Powershell函数。 根据参数$ verbose的值,我想使用-Verbose。

我使用API​​编写的代码完成了工作......但我觉得应该有更好的方法,减少代码行。使用 Invoke-WebRequest

获得两倍的行感是错误的

所以我的问题是: Powershell中有一种处理开关参数的最佳方法吗?

这是功能:

function Invoke-MarkLogicManagementAPI($server, $apiFolder, $adminCredentials, $HTTPmethod, $body, $verbose)
{
    $resp1HTTPCode= "Not set"
    try
    {
        $uri = "http://$($server):8002/manage/v2/$apiFolder"
        if ($verbose -eq $true)
        {
            $resp1 = Invoke-WebRequest -Uri $uri -Body $body -Method "$HTTPmethod" -Credential $adminCredentials -ContentType "application/json" -ErrorAction SilentlyContinue -Verbose
        }
        else
        {
            $resp1 = Invoke-WebRequest -Uri $uri -Body $body -Method "$HTTPmethod" -Credential $adminCredentials -ContentType "application/json" -ErrorAction SilentlyContinue
        }
        $resp1HTTPCode = $resp1.StatusCode
    }
    catch [Exception]
    {
        $resp1HTTPCode = $_.Exception.Response.StatusCode.Value__
    }

    return $resp1HTTPCode
}

2 个答案:

答案 0 :(得分:4)

是的,您可以将布尔值传递给switch参数。在你的情况下:

-Verbose:$verbose

例如:

function DoSomething
{
    [CmdletBinding()]
    Param()
    Write-Verbose "output"
}

DoSomething -verbose:$true # Does write output
DoSomething -verbose:$false # no output

答案 1 :(得分:3)

由于您的问题涉及详细使用[CmdletBinding()]是一种简单的方法来解释这种差异。我想向您介绍splatting,这是将不同数量的参数传递给cmdlet而不必实际写出每个命令的好方法。

function Get-Bagels{
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory=$True)]
        [string]$Filter,
        [switch]$Recurse=$false,
        [switch]$FilesOnly 
    )

    $parameters = @{
        Filter = $filter
        Recurse = $recurse
    }

    If($filesonly){$parameters.File=$True}

    Get-ChildItem @parameters
}

真正的简单示例是创建哈希表$parameters并添加我们想要传递给Get-ChildItem的参数。我展示了几种方法来填充表格您可以看到文件开关有条件地添加了一个小的if

这种方式无论使用什么参数,cmdlet调用每次都是相同的。

因此以下函数调用将起作用

Get-Bagels -Filter "*.txt"
Get-Bagels -Filter "*.txt" -Recurse
Get-Bagels -Filter "*.txt" -FilesOnly
Get-Bagels -Filter "*.txt" -Recurse:$False -FilesOnly