gpt4 book ai didi

function - 是否可以在 PowerShell 函数中自动传递开关参数?

转载 作者:行者123 更新时间:2023-12-05 01:37:20 25 4
gpt4 key购买 nike

我根据 here 的一些灵感创建了一个函数.

到目前为止,它按预期工作,但只有在调用该函数时提供选项开关时才有效。我想要做的只是能够在不提供开关的情况下键入“Get-ExternalIP”。然后该函数应自动使用 -All 开关。我也不确定为什么 -All 开关甚至可以工作......

我尝试设置参数 $All = $true 它不起作用,VSCode 告诉我无论如何都不推荐这样做。

有没有办法在没有任何参数的情况下调用函数时自动传递 -All 选项开关?如果指定了 -All 开关,有人能解释为什么该函数返回所有信息吗?

谢谢!

这是我的代码:

function Get-ExternalIP {
[CmdletBinding()]
param (
[parameter(Mandatory = $false)][switch]$Ip,
[parameter(Mandatory = $false)][switch]$HostName,
[parameter(Mandatory = $false)][switch]$City,
[parameter(Mandatory = $false)][switch]$Region,
[parameter(Mandatory = $false)][switch]$Country,
[parameter(Mandatory = $false)][switch]$Location,
[parameter(Mandatory = $false)][switch]$Provider,
[parameter(Mandatory = $false)][switch]$PostalCode,
[parameter(Mandatory = $false)][switch]$TimeZone,
[parameter(Mandatory = $false)][switch]$All
)

$IpInfo = Invoke-RestMethod https://ipinfo.io/json

switch ($PSBoundParameters.Values) {
$Ip { $IpInfo.ip }
$HostName { $IpInfo.hostname }
$City { $IpInfo.city }
$Region { $IpInfo.region }
$Country { $IpInfo.country }
$Location { $IpInfo.loc }
$Provider { $IpInfo.org }
$PostalCode { $IpInfo.postal }
$TimeZone { $IpInfo.timezone }
Default { $IpInfo }

}

}

Get-ExternalIP

最佳答案

我会使用 $PSBoundParameters.Keys,因为您的开关已正确命名以匹配返回的信息:

function Get-ExternalIP {
[CmdletBinding()]
param (
[parameter(Mandatory=$false)][switch]$Ip,
[parameter(Mandatory=$false)][switch]$HostName,
[parameter(Mandatory=$false)][switch]$City,
[parameter(Mandatory=$false)][switch]$Region,
[parameter(Mandatory=$false)][switch]$Country,
[parameter(Mandatory=$false)][switch]$Location,
[parameter(Mandatory=$false)][switch]$Provider,
[parameter(Mandatory=$false)][switch]$PostalCode,
[parameter(Mandatory=$false)][switch]$TimeZone,
[parameter(Mandatory=$false)][switch]$All
)
$IpInfo = Invoke-RestMethod https://ipinfo.io/json
if ($All) { return $IpInfo }

# exclude Common Parameters
$commonParams = 'Debug','ErrorAction','ErrorVariable','InformationAction','InformationVariable','OutVariable',
'OutBuffer','PipelineVariable','Verbose','WarningAction','WarningVariable','WhatIf','Confirm'

$items = (@($PSBoundParameters.Keys) | Where-Object { $commonParams -notcontains $_ }) -replace
'Location', 'loc' -replace 'Provider', 'org' -replace 'PostalCode', 'postal'

$IpInfo | Select-Object $items
}

作为mklement0评论说,有比上面代码中显示的更好的方法来检索使用过的开关。

与其过滤掉已知的通用参数,不如根据 $IpInfo 对象中返回的属性检查 $PSBoundParameter 键更有意义。

$items = ($PSBoundParameters.Keys -replace 'Location', 'loc' -replace 'Provider', 'org' -replace 'PostalCode', 'postal').Where({ $_ -in $IpInfo.psobject.Properties.Name })

关于function - 是否可以在 PowerShell 函数中自动传递开关参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60799927/

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