2010-10-11 23 views
5

Ho uno script PowerShell che desidero essere in grado di definire diversi punti di partenza per. Una volta raggiunto il punto di partenza, lo script riprende da quel punto e continua attraverso il codice rimanente nello script. Non credo che una dichiarazione di un caso funzionerà poiché non penso che lascerà scorrere lo script da qualunque punto di partenza sia definito.Come avviare uno script in un punto specifico in Powershell

Mi aspetto di vedere qualcosa di simile all'avvio della sceneggiatura.

Scegliere il punto di partenza:

  1. partire
  2. Inizia la fase 2
  3. Inizia punto 3 ecc .....

Quando la selezione viene effettuata lo script salta a quel punto e poi scorrerà attraverso il resto dello script.

Risposta: il codice sta per finire un aspetto simile a questo:

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

Grazie per il vostro aiuto

risposta

3

AFAIK, non c'è nulla di simile in PowerShell. Se hai bisogno di qualcosa di semplice, questo potrebbe funzionare per te:

*) Creare uno script con passaggi definiti come funzioni. Ogni funzione alla fine chiama il prossimo passo-funzione:

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

*) Se si vuole iniziare con la fase 1: dot-fonte Steps.ps1 e chiamare Step1:

. .\Steps.ps1 
Step1 

*) Se si vuole iniziare con la fase 2: dot-fonte Steps.ps1 e chiamare Step2:

. .\Steps.ps1 
Step2 
0

PowerShell non contiene un comando di tipo GOTO, quindi è necessario incapsulare ciascuno dei passi logici (Inizio, passo2, passo3, ...) in una procedura/blocco di codice di qualche tipo e chiamare come appropriato. Mentre un'istruzione switch non scala bene se avete bisogno di un sacco di scelte, per tre sarebbe abbastanza semplice - qui è un'idea, anche se sono sicuro questa idea può essere implementato meglio:

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" 

uscita:

Starting 
One 
Two 
0

un approccio più diretto sarebbe quella di utilizzare una serie di if dichiarazioni, in modo che tutte le funzioni di supporto possono essere utilizzati indipendentemente senza dover fare riferimenti incrociati ad altri passaggi.

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

Si noti inoltre che una dichiarazione switch continuerà a valutare le condizioni fino a quando non incontra un'istruzione break, quindi questo modulo funziona anche:

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

'Done!' 
1

Questa risposta supplementare è probabilmente troppo per questo particolare compito . Ma potrebbe essere utile conoscere lo strumento. Può essere utilizzato per attività simili e più complesse.

Lo strumento è Invoke-Build.ps1. È uno script standalone, basta metterlo ovunque nel percorso, è questo. quindi utilizzare il codice come questo:

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 differenza tra questo e la risposta precedente è che con compito approccioI blocchi di codice passonon devono essere esplicitamente dipendenti, vale a dire chiamare altri . È l'infrastruttura del compito che unisce le azioni insieme.

Problemi correlati