Как запустить скрипт в указанной точке в Powershell - PullRequest
6 голосов
/ 11 октября 2010

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

Я ожидаю увидеть что-то подобное при запуске сценария.

Пожалуйста, выберите отправную точку:

  1. Начало
  2. Начните сшаг 2
  3. начать с шага 3 и т. д. .....

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

Ответ: Код в конечном итоге будет выглядеть примерно так:

#steps
$stepChoice = read-host 'Where would you like to start.'

switch($stepChoice)
{
    1{Step1}
    2{Step2}
    3{Step3}

}

function Step1 { 
    'Step 1' 
    Step2 
} 
function Step2 { 
    'Step 2' 
    Step3 
} 
function Step3 { 
    'Step 3' 
    'Done!' 
}

Спасибо за вашу помощь

Ответы [ 4 ]

5 голосов
/ 11 октября 2010

AFAIK, в PowerShell ничего подобного нет.Если вам нужно что-то простое, это может работать для вас:

*) Создайте сценарий с шагами, определенными как функции.Каждая функция в конце вызывает следующую пошаговую функцию:

# Steps.ps1
function Step1 {
    'Step 1'
    Step2
}
function Step2 {
    'Step 2'
    Step3
}
function Step3 {
    'Step 3'
    'Done!'
}

*) Если вы хотите начать с шага 1: создайте точечный источник Steps.ps1 и вызовите Step1:

. .\Steps.ps1
Step1

*) Если вы хотите начать с шага 2: поставьте точку в Steps.ps1 и вызовите Step2:

. .\Steps.ps1
Step2
1 голос
/ 27 августа 2011

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

Инструмент - Invoke-Build.ps1 . Это автономный скрипт, просто поместите его в любом месте пути, вот и все. Затем используйте такой код:

Steps.ps1

# Invoke-Build task is a sequence of scripts and other tasks.
# This task does its job and then calls the task Step2.
task Step1 {
    'Step 1'
},
Step2

# This task does its job and then calls the task Step3.
task Step2 {
    'Step 2'
},
Step3

# The last task, just its name and code.
task Step3 {
    'Step 3'
}

Test.ps1

Invoke-Build step1 Steps.ps1 # do steps 1, 2, 3
Invoke-Build step2 Steps.ps1 # do steps 2, 3
Invoke-Build step3 Steps.ps1 # do just step 3

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

0 голосов
/ 12 июня 2011

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

[int]$stepChoice = read-host 'Where would you like to start.'

if( $stepChoice -le 1 ) {
  'Step 1'
}

if( $stepChoice -le 2 ) {
  'Step 2'
}

if( $stepChoice -le 3 ) {
  'Step 3'
}

'Done!'

Также обратите внимание, чтоОператор switch будет продолжать оценивать условия, пока не встретит оператор break, поэтому эта форма также будет работать:

switch( $stepChoice ) {
  { $_ -le 1 } { 'Step 1' }
  { $_ -le 2 } { 'Step 2' }
  { $_ -le 3 } { 'Step 3' }
}

'Done!'
0 голосов
/ 11 октября 2010

PowerShell не содержит команду типа GOTO, поэтому вы должны инкапсулировать каждый из логических шагов (Beginning, step2, step3, ...) в некоторый блок процедуры / кода и вызывать их соответствующим образом.Хотя оператор switch не будет хорошо масштабироваться, если вам нужно много вариантов, для трех он будет довольно простым - вот идея, хотя я уверен, что эту идею можно реализовать лучше:

function Begin () { "Starting" }
function Step-1 () { "One" }
function Step-2 () { "Two" }

function Take-Action() {
  param([string]$choice);
  switch ($choice) {
    "Start" { & Begin ; Take-Action "One" }
    "One" { & Step-1; Take-Action "Two" }
    "Two" { & Step-2 }
  }
}

& Take-Action "Start"

Выход:

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