我正在尝试写看起来很简单的东西,但是我已经花了几个小时了,但仍然无法获得我需要的东西。
我有一个PowerShell脚本,该脚本将用于启动或关闭虚拟机。我想让用户指定ResourceGroup名称,单个VM名称或带有VM名称的文本文件。
此脚本用于Azure,但问题特定于param()声明。
我尝试了在这里可以想到的每种组合,使参数成为参数集的一部分,使它们成为强制性的,而不是强制性的,等等。但是我无法做到这一点。
感谢您的帮助!
param (
[Parameter (Mandatory = $true, ParameterSetName = 'ByResourceGroup')]
[string]$ResourceGroup,
[Parameter (Mandatory = $true, ParameterSetName = 'ByFile')]
[string]$File,
[Parameter (Mandatory = $true, ParameterSetName = 'ByName')]
[string]$Name,
[Parameter (Mandatory = $false, ParameterSetName = 'ByResourceGroup')]
[Parameter (Mandatory = $false, ParameterSetName = 'ByFile')]
[Parameter (Mandatory = $false, ParameterSetName = 'ByName')]
[switch]$Start,
[Parameter (Mandatory = $false, ParameterSetName = 'ByResourceGroup')]
[Parameter (Mandatory = $false, ParameterSetName = 'ByFile')]
[Parameter (Mandatory = $false, ParameterSetName = 'ByName')]
[switch]$Stop
)
用户应该能够通过以下方式: -资源组 要么 -文件 要么 -名称
AND
传递以下任一项: -开始 要么 -停止
不是两者!
我认为我在第一组中就具有这种正确性,但是我不能让-Start和-Stop独占一面。
Get-help这样说:
SYNTAX
C:\Set-AzureVM.ps1 -ResourceGroup <String> [-Start] [-Stop] [<CommonParameters>]
C:\Set-AzureVM.ps1 -File <String> [-Start] [-Stop] [<CommonParameters>]
C:\Set-AzureVM.ps1 -Name <String> [-Start] [-Stop] [<CommonParameters>]
I am looking for something more like this:
SYNTAX
C:\Set-AzureVM.ps1 -ResourceGroup <String> -Start [<CommonParameters>]
C:\Set-AzureVM.ps1 -File <String> -Start [<CommonParameters>]
C:\Set-AzureVM.ps1 -Name <String> -Start [<CommonParameters>]
C:\Set-AzureVM.ps1 -ResourceGroup <String> -Stop [<CommonParameters>]
C:\Set-AzureVM.ps1 -File <String> -Stop [<CommonParameters>]
C:\Set-AzureVM.ps1 -Name <String> -Stop [<CommonParameters>]
仅需结束此操作即可...我最终对此做了一些更改(需要更改,代码也更改了)。正如其他人所建议的那样,我同意我试图做的事情无论如何都是不可能的。另外,我正在处理用户将在代码中同时选择-Start和-Stop或都不选择的可能性。感谢大家的评论!
SYNTAX
C:\Set-AzureVM.ps1 -Name <String> -ResourceGroup <String> [-Start] [-Stop] [<CommonParameters>]
C:\Set-AzureVM.ps1 -File <String> [-Start] [-Stop] [<CommonParameters>]
答案 0 :(得分:2)
我认为您尝试做的事是不可能的。您可以考虑将功能分解为两个单独的脚本。
或者,您可以使用开关-stop
进行启动和停止。默认情况下,-stop
在您的脚本或函数中的值为$false
。
# implicitly start the vm
Set-AzureVM.ps1 -Name <String>
# explicitly stop the vm
Set-AzureVM.ps1 -Name <String> -stop
function Set-AzureVM () {
param(
[Parameter (Mandatory, ParameterSetName = 'ByFile')]
[string]$File,
[Parameter (Mandatory, ParameterSetName = 'ByName')]
[string]$Name,
[switch]$Stop
)
if($Stop){
Write-Host 'Stopping VM'
}
if(!$stop){
Write-Host 'Starting VM'
}
}
Get-Command Set-AzureVM -Syntax
Set-AzureVM -File <string> [-Stop] [<CommonParameters>]
Set-AzureVM -Name <string> [-Stop] [<CommonParameters>]