Изменить переменную с помощью переключателя в Powershell - PullRequest
3 голосов
/ 01 марта 2020

Я хочу установить $ url1 на основе различных доступных переключателей. Я использую это, чтобы иметь возможность установить URL загрузки в зависимости от местоположения с помощью переключателя. Я убрал все остальное из скрипта, чтобы ускорить его для всех, кто пытается помочь.

Param (
    [switch] $newyork,
    [switch] $florida,
    [switch] $california

)

$url1 = if ($newyork) {"https://newyork.com"}
    elseif ($florida) {"https://florida.com"}
    elseif ($california) {"https://california.com"}

Write-Host $url1

Этот скрипт прекрасно работает, но я хочу убедиться, что это самый эффективный способ сделать это .

В частности, мне любопытно, есть ли способ сделать это, но держу все это в блоке Param. (Это поможет мне согласоваться с некоторыми другими моими сценариями.)

1 Ответ

2 голосов
/ 01 марта 2020

То, что вы в данный момент делаете, будет работать, и, вероятно, с этим не будет проблем с производительностью или эффективностью. Однако можно использовать один, два или все три переключателя при запуске сценария или функции. Так как вы делаете блоки if и elseif, первый код, который оценивается как true, будет иметь свой кодовый блок, а остальные блоки игнорируются. Ниже приведены некоторые другие подходы, которые можно использовать.


Вариант 1: В любое время можно использовать любое количество переключателей

Param (
    [switch] $newyork,
    [switch] $florida,
    [switch] $california

)

if ($newyork) {"https://newyork.com"}
if ($florida) {"https://florida.com"}
if ($california) {"https://california.com"}

Вам следует go только с инструкциями if, если вы хотите, чтобы несколько переключателей использовались одновременно.


Опция 2. Только один переключатель можно использовать одновременно с наборами параметров

function test {
  param(
    [Parameter(ParameterSetName='NewYork',Mandatory)]
    [switch]$newyork,
    [Parameter(ParameterSetName='florida',Mandatory)]
    [switch]$florida,
    [Parameter(ParameterSetName='california',Mandatory)]
    [switch]$california
  )
  if ($newyork) {
    "newyork"
  }
  if ($florida) {
    "florida"
  }
  if ($california) {
    "california"
  }
}

Для этого необходимо использовать один переключатель. Более или менее выдает ошибку.


Опция 3: Использование перечислимых типов для принудительной установки значения одного параметра

enum Location
{
    newyork
    florida
    california
}
function test {
    param(
        [Parameter(Mandatory)]
        [Location]$location
    )

    "https://{0}.com" -f $location
}

Перечислимые типы имеют свои место. Мне нравятся они для этого решения. Однако он попытается проанализировать входные данные, что может привести к нежелательным результатам. Например, test new свяжет newyork с $location.


Опция 4: проверка строки с одним параметром

function test {
    param(
        [Parameter(Mandatory)]
        [ValidateSet('newyork','florida','california')]
        [string]$location
    )

    "https://{0}.com" -f $location
}

Для этого требуется, чтобы при запуске функции была введена одна из трех строк. Использование оператора формата строки (-f) позволяет нам сократить код и удалить весь if logi c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...