gpt4 book ai didi

powershell - 如何使用多个参数仅在PowerShell中强制高级功能的位置0

转载 作者:行者123 更新时间:2023-12-02 23:41:45 27 4
gpt4 key购买 nike

我正在将我的标准功能之一转换为高级功能。该功能基本上是与我公司中的服务器对话,并返回有关我们所拥有产品所需的信息。当前它被编码为仅扫描所有服务器,但是我想在MyFunc -All将扫描所有服务器的位置添加开关,MyFunc -Single SERVERNAME将仅扫描该服务器,MyFunc -Help将显示有关该功能的信息。

我的功能是工作到哪里,如果一切正常的话,应该把它放到哪里。我遇到的问题是在运行该功能时迫使某人在位置0输入一个开关。照原样,如果我在不带开关的情况下调用该函数,它将要求为“All”提供一个值。如果我将该值保留为空白或输入任何内容,则会收到错误消息“无法对参数'All'进行参数转换”。

这是我对高级功能的首次尝试,因此我确定我遗漏了一些东西,但我认为会有一种方法要求输入位置0。

我要寻找的示例(如果可能)

PS> MyFunc

PS>“由于未提供任何开关,因此要求我们提供开关”

PS>-全部或-帮助或-单个服务器名称

PS>结果打印出来

function MyFunc
{
[CmdletBinding()]
PARAM(
[Parameter(Mandatory=$true, Position=0)]
[switch]$All,
[switch]$Help,
[switch]$Single,
[Parameter(ValueFromRemainingArguments=$true)]
[string]$ServerName
)

If($all)
{
$Servers = @("Server1",
"Server2",
"Server3",
"Server4",
"Server5")
#Check servers
}
elseif($Single)
{
$Servers = @($ServerName)
#Check server
}
elseif($Help)
{
#Print help message
}
}

最佳答案

我建议对调用函数和定义其参数的方式进行一些更改。

首先,摆脱-Help开关。 PowerShell具有(非常好)帮助语义,您应该使用它们。为您的函数定义comment-based help,然后用户可以调用Get-Help MyFunchelp MyFunc并查看您所有函数的信息。最好的部分是,如果您只需要参数和需要哪些参数,则无需执行任何操作。它会自动为您生成(继续尝试并立即获得功能的帮助,无需更改)。

其次,我的建议是避免在函数中静态定义服务器(对于-All)。只需采用一个包含数组的-ServerName参数,并使您的函数检查其中的内容。在PowerShell中,当接受单个项目和一个数组时,使这项工作非常容易。使用高级功能,它也可以在管道上工作,而无需进行额外的更改。

这将使您的函数仅具有一个参数,同时使其保持通用性。我的函数版本如下所示:

function MyFunc
{
[CmdletBinding()]
PARAM(
[Parameter(
ValueFromRemainingArguments=$true,
ValueFromPipeline=$true
)]
[string[]]
$ServerName
)

Process {
foreach ($server in $ServerName) {
# check this particular server
}
}
}

您可以通过以下几种不同的方式来调用此函数,这些函数都可以正常工作:
MyFunc 'SomeServer'
MyFunc 'Server4' 'Server5' 'Server6' # Spaces
MyFunc -ServerName 'ThisServer'
MyFunc -ServerName 'ThatServer','ThisServer','OtherServer'
'CoolServer' | MyFunc
'Server1','Server2','Server3' | MyFunc

该函数的调用者可以使用 $PSDefaultParameterValues 预定义服务器列表。

如果确实要预定义服务器列表,则可以将它们放在单独的文本文件中(每行一个),然后执行以下操作:
Get-Content -Path 'C:\List\Servers.txt' | MyFunc

这就是在您的函数中支持管道的好处!

您还可以定义一个为您提供列表的函数,稍后可以更改其实现:
function Get-DefaultServerList {
[CmdletBinding()]
param()

@(
'Server1'
'Server2'
'Server3'
)

}

然后,您可以执行以下操作:
Get-DefaultServerList | MyFunc

重点是什么?您可以稍后更改该函数的定义,以(例如)从文件,Web服务,注册表等获取列表。

关于powershell - 如何使用多个参数仅在PowerShell中强制高级功能的位置0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40141699/

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