2010-10-11 26 views
5

Tengo una secuencia de comandos de powershell para la que quiero poder definir puntos de partida diferentes. Una vez que se alcanza el punto de partida, el script retoma desde ese punto y continúa a través del código restante en el script. No creo que una declaración de caso funcione, ya que no creo que eso permita que el script fluya desde el punto de partida definido.Cómo iniciar una secuencia de comandos en un punto especificado en Powershell

Esperaría ver algo como esto cuando se inició el script.

Por favor seleccione su punto de partida:

  1. partir
  2. de inicio en el paso 2
  3. de inicio en el paso 3, etc .....

Cuando la selección se realiza el guión salta a ese punto luego se ejecutará a través del resto de la secuencia de comandos.

Respuesta: El código se va a terminar buscando algo como esto:

#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!' 
} 

Gracias por su ayuda

Respuesta

3

AFAIK, no hay nada como esto en PowerShell. Si necesita algo simple, esto podría funcionar para usted:

*) Cree un script con pasos definidos como funciones. Cada función en el extremo llama al siguiente paso a la función:

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

*) Si quieres empezar con el paso 1: punto-fuente de la Steps.ps1 y llame Paso 1:

. .\Steps.ps1 
Step1 

*) Si quieres empezar con el paso 2: punto-fuente de la Steps.ps1 y llame paso 2:

. .\Steps.ps1 
Step2 
0

PowerShell no contiene un comando de tipo IR A, por lo que debe encapsular cada una de las Pasos lógicos (Inicio, paso 2, paso 3, ...) en un bloque de procedimiento/código de algún tipo y llamada según corresponda. Mientras que una sentencia switch no escala bien si necesita una gran cantidad de opciones, para los tres sería bastante simple - aquí es una idea, aunque estoy seguro de que esta idea se puede implementar mejor:

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" 

de salida:

Starting 
One 
Two 
0

un enfoque más directo sería el uso de una serie de declaraciones if, de modo que cualquier funciones auxiliares se pueden utilizar de forma independiente sin tener que hacer una referencia cruzada de otros pasos.

[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!' 

También tenga en cuenta que una declaración switch continuará evaluando las condiciones hasta que se encuentre una sentencia break, por lo que esta forma también trabajará:

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

'Done!' 
1

Esta respuesta adicional es probablemente demasiado para esta tarea particular . Pero puede ser útil conocer la herramienta. Se puede usar para tareas similares y más intrincadas.

La herramienta es Invoke-Build.ps1. Es una secuencia de comandos independiente, simplemente colóquelo en cualquier lugar de la ruta, esto es todo. continuación, utilizar el código como el siguiente:

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 

La diferencia entre esto y la respuesta anterior es que con tarea enfoqueLos bloques de código de pasono tienen que ser explícitamente dependientes, es decir, llamar al en algunos otros pasos. Es la infraestructura de la tarea que pega las acciones juntas.

Cuestiones relacionadas