2010-10-11 66 views
5

我有一個powershell腳本,我希望能夠定義不同的起點。一旦起始點被擊中,腳本就會從該點開始繼續,並繼續執行腳本中的其餘代碼。我不相信案例陳述會奏效,因爲我認爲這不會讓腳本從任何起點出發。如何在Powershell中的指定點啓動腳本

我希望在腳本啓動時看到類似這樣的內容。

請選擇您的出發點:

  1. 在步驟3等開始
  2. 開始在步驟2
  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!' 
} 

感謝您的幫助

回答

3

AFAIK,在PowerShell中沒有這樣的東西。如果你需要簡單的東西,這可能適用於你:

*)創建一個腳本,其步驟定義爲函數。最終每個函數調用下一步功能:

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

*)如果你想開始第1步:點源Steps.ps1並調用第一步:

. .\Steps.ps1 
Step1 

*)如果你想開始第2步:點源Steps.ps1並調用第二步:

. .\Steps.ps1 
Step2 
0

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 
0

更直接的方法是使用一系列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!' 
1

這個額外的答案很可能是太多了這個特殊的任務。 但是瞭解該工具可能有用。 它可以用於類似和更復雜的任務。

該工具是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 

這和以前的答案之間的區別在於任務方法 實際步驟代碼塊不必明確依賴,即要調用 其他一些步驟。這是將行動粘合在一起的任務基礎設施。

相關問題