2010-10-11 24 views
5

Mam skrypt PowerShell, chcę móc zdefiniować różne punkty początkowe dla. Po osiągnięciu punktu początkowego skrypt odbiera się od tego punktu i przechodzi do pozostałego kodu w skrypcie. Nie wierzę, że stwierdzenie dotyczące sprawy zadziała, ponieważ nie sądzę, że pozwoli to na przepływ skryptu z dowolnego punktu początkowego.Jak uruchomić skrypt w określonym punkcie Powershell

Spodziewam się zobaczyć coś takiego, gdy skrypt został uruchomiony.

Proszę wybrać punkt początkowy:

  1. Począwszy
  2. Zacznij od kroku 2
  3. Zacznij od kroku 3 itd .....

Po dokonaniu wyboru skryptu przeskakuje do tego punktu, a następnie przejdzie przez pozostałą część skryptu.

Odpowiedź: Kod ma zamiar w końcu wygląda mniej więcej tak:

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

dzięki za pomoc

Odpowiedz

3

AFAIK, nic takiego nie ma w PowerShell. Jeśli potrzebujesz czegoś prostego, może to zadziałać:

*) Utwórz skrypt z krokami zdefiniowanymi jako funkcje. Każda funkcja w końcu nazywa następnym kroku funkcji:

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

*) Jeśli chcesz zacząć od kroku 1: dot-źródłowy Steps.ps1 i nazywają Krok 1:

. .\Steps.ps1 
Step1 

*) Jeżeli chcesz rozpocząć z kroku 2: dot-źródłowy Steps.ps1 i nazywają krok 2:

. .\Steps.ps1 
Step2 
0

PowerShell nie zawiera polecenie typu GOTO, więc należy ująć każdy z kroki logiczne (Początek, krok2, krok3, ...) w jakimś bloku procedur/kodu i wywołaj odpowiednio. Podczas gdy instrukcja switch nie będą skalowane dobrze, jeśli potrzebują dużo wyborów, na trzech byłoby dość prosta - tutaj jest pomysł, choć jestem pewien, że ten pomysł może zostać zrealizowany lepiej:

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" 

Output:

Starting 
One 
Two 
0

bardziej bezpośrednie podejście byłoby użyć serię if sprawozdania, tak że wszelkie funkcje pomocnicze mogą być używane niezależnie bez konieczności odwoływania się do innych kroków.

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

Należy również pamiętać, że switch oświadczenie będzie nadal oceniać warunki aż napotka break oświadczenie, więc ta forma będzie również pracować:

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

'Done!' 
1

Ta dodatkowa odpowiedź jest chyba za dużo dla tego konkretnego zadania . Ale może być przydatne wiedzieć o narzędziu. Może być używany do podobnych i bardziej skomplikowanych zadań.

Narzędzie to Invoke-Build.ps1. Jest to samodzielny skrypt, wystarczy umieścić go w dowolnym miejscu na ścieżce, to jest to. Następnie użyj kodu:

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 

Różnica między tym a poprzednim odpowiedź jest taka, że ​​z Zadanie podejście rzeczywiste bloki kodu kroków nie muszą być jednoznacznie zależne, to jest wywoływanie kilka innych kroków. Jest to infrastruktura zadań, która łączy działania.

Powiązane problemy