выберите несколько инструкций переключения

#powershell #powershell-ise

#powershell #powershell-ise

Вопрос:

У меня есть приведенный ниже скрипт, который позволяет мне переключаться между различными элементами и запускать функции в них одну за другой.

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

Кто-нибудь может показать мне, как это сделать? Я не понимаю, как завершить это и работать должным образом.

 write-host "Sets up location you want to run staging"
$ElementDistro = Read-Host -Prompt "Which Element do you want to run? (TV30/TV30BP/TV30LM/TV30PV/LT101/XR2/MU11/SAP)"
while ($ElementDistro -notmatch "^(TV30|TV30BP|TV30LM|TV30PV|LT101|XR2|MU11|SAP)$")
{
    write-host "you have enterd an error" -ForegroundColor Red
    write-host "You must type TV30 or TV30BP or TV30LM or TV30PV or LT101 or XR2 or MU11 or SAP"
    write-host "you typed $ElementDistro"
    write-host "set location you want to run staging"
    $ElementDistro = Read-Host -Prompt "Which Element do you want to run? (TV30/TV30BP/TV30LM/TV30PV/LT101/XR2/MU11/SAP)"
}

switch ($ElementDistro)
{
    'TV30'
    {
        # Do TV30 Stuff
        write-host "you have entered TC TV30"
        $passwd = convertto-securestring -AsPlainText -Force -String ''
        $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist "",$passwd
        $session = enter-pssession -computername '' -credential $cred
        $source = Select-TC
        $destination = 'Desktop'
        "Calling Copy-Item with parameters source: '$source', destination: '$destination'."
        Copy-Item -Path $source -Destination $destination
        exit-pssession
        break
    }

    'TV30BP'
    {
        # Do TV30BP Stuff
        $passwd = convertto-securestring -AsPlainText -Force -String ''
        $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist "",$passwd
        $session = enter-pssession -computername '' -credential $cred
        $source = Select-TC
        $destination = 'Desktop'
        "Calling Copy-Item with parameters source: '$source', destination: '$destination'."
        Copy-Item -Path $source -Destination $destination
        # exit-pssession
        break
    }

    'TV30LM'
    {
        # Do TV30LM stuff
        $passwd = convertto-securestring -AsPlainText -Force -String ''
        $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist "",$passwd
        $session = enter-pssession -computername '' -credential $cred
        $source = Select-TC
        $destination = 'Desktop'
        "Calling Copy-Item with parameters source: '$source', destination: '$destination'."
        Copy-Item -Path $source -Destination $destination
        exit-pssession
        break
    }

    'TV30PV'
    {
        # Do TV30PV stuff
        $passwd = convertto-securestring -AsPlainText -Force -String ''
        $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist "",$passwd
        $session = enter-pssession -computername '' -credential $cred
        $source = Select-TC
        $destination = 'Desktop'
        "Calling Copy-Item with parameters source: '$source', destination: '$destination'."
        Copy-Item -Path $source -Destination $destination
        exit-pssession
        break
    }

    'LT101'
    {
        # Do LT101 stuff
        $passwd = convertto-securestring -AsPlainText -Force -String ''
        $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist "",$passwd
        $session = enter-pssession -computername '' -credential $cred
        break
    }

    'XR2'
    {
        # Do XR2 stuff
        $passwd = convertto-securestring -AsPlainText -Force -String ''
        $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist "",$passwd
        $session = enter-pssession -computername '' -credential $cred
        break
    }

    'MU11'
    {
        # Do TF10 stuff
        $passwd = convertto-securestring -AsPlainText -Force -String ''
        $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist "",$passwd
        $session = enter-pssession -computername '' -credential $cred
        break
    }

    'SAP'
    {
        # Do SAP stuff
        $passwd = convertto-securestring -AsPlainText -Force -String ''
        $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist "",$passwd
        $session = enter-pssession -computername '' -credential $cred
        break
    }
}
break
}
  

Комментарии:

1. Вы могли бы обернуть весь этот бит внутри Do{<your script>}While(!($ElementDistro -ieq "q")) , и он просто вернется к меню, пока вы не введете Q. Затем добавьте Q к вашим текущим параметрам в качестве опции выхода.

2. Это может сработать для того, чего я пытаюсь достичь. Я все еще ищу, как сделать так, чтобы я мог выбрать несколько одновременно и запустить его.

3. К вашему сведению, ваша последняя закрывающая фигурная скобка ничему не соответствует. Кроме того, ранее у вас отсутствовали открывающие кавычки Desktop в разделах TV30BP и TV30PV.

4. Спасибо за информацию. Я даже не заметил, что пропустил этот материал.

5. Используйте хороший редактор кода с подсветкой синтаксиса. Недостающие кавычки выскочили у меня в тот момент, когда я добавил подсветку синтаксиса. Или, если у вас нет хорошего редактора кода, вы можете использовать ISE PowerShell. 😉

Ответ №1:

Если у вас есть хотя бы версия V3, вы можете использовать Out-GridView с -OutPutMode Multiple в качестве меню для выбора нескольких элементов из:

 $Menu = 'TV30','TV30BP','TV30LM','TV30PV','LT101','XR2','MU11','SAP','ALL'

$Choices = $Menu | Out-GridView -OutputMode Multiple -Title 'Select Locations you want to run staging, and click OK.'

Switch ($Choices)
{ 
  .....
  

Комментарии:

1. Это то, что мне нужно для этого сценария. Спасибо.

Ответ №2:

Быстрый ответ заключается в том, что оператор switch Powershell принимает массив для ввода. Если вы не используете оператор break в конце каждого варианта переключения, он будет выполнять каждый случай, который соответствует. Введите свои варианты в виде списка, разделенного запятыми, и поместите их в массив с помощью инструкции split.

Каждый выбор в вашем массиве $ Choices будет выполнен. Если вы разместите оператор Pause там, где находятся ваши операторы break, вы можете сделать паузу при завершении каждого шага.

 $Choices = @('TV30','MU11')
switch ($Choices)
{
'TV30' {some code}
'TV30BP' {some code}
'MU11' {some code}
}
  

Комментарии:

1. Это отлично работает. Но я все еще использую оператор while над ним, чтобы открыть окно и ввести нужный мне выбор. Так что мне нужно было бы изменить эту часть для чтения вариантов, чтобы она заполнила состояние переключателя.

2. Спасибо за помощь. Вы действительно помогли мне с другим сценарием, над которым я работаю.