2010-10-11 26 views
5

Tôi có tập lệnh PowerShell mà tôi muốn có thể xác định các điểm bắt đầu khác nhau cho. Khi điểm bắt đầu được nhấn, tập lệnh sẽ nhận từ điểm đó và tiếp tục thông qua mã còn lại trong tập lệnh. Tôi không tin rằng một tuyên bố trường hợp sẽ làm việc kể từ khi tôi không nghĩ rằng sẽ chỉ cho phép kịch bản chảy qua từ bất cứ điểm bắt đầu được xác định.Cách bắt đầu tập lệnh tại một điểm cụ thể trong Powershell

Tôi hy vọng sẽ thấy một cái gì đó như thế này khi tập lệnh được bắt đầu.

Vui lòng chọn điểm bắt đầu:

  1. Bắt đầu
  2. Bắt đầu ở bước 2
  3. Bắt đầu ở bước 3 vv .....

Khi lựa chọn được thực hiện kịch bản nhảy đến điểm đó sau đó sẽ chạy qua phần còn lại của tập lệnh.

trả lời: Mã này sẽ kết thúc lên tìm kiếm một cái gì đó như thế này:

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

Nhờ sự giúp đỡ của bạn

Trả lời

3

AFAIK, không có gì giống như thế này trong PowerShell. Nếu bạn cần điều gì đó đơn giản, điều này có thể phù hợp với bạn:

*) Tạo tập lệnh có các bước được xác định là hàm. Mỗi chức năng cuối cùng gọi tiếp theo bước chức năng:

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

*) Nếu bạn muốn bắt đầu với bước 1: dot-nguồn Steps.ps1 và gọi Bước 1:

. .\Steps.ps1 
Step1 

*) Nếu bạn muốn bắt đầu với bước 2: dot-nguồn Steps.ps1 và gọi bước 2:

. .\Steps.ps1 
Step2 
0

PowerShell không chứa một lệnh GOTO loại, vì vậy bạn phải đóng gói mỗi các bước logic (Bắt đầu, bước 2, bước 3, ...) trong một khối thủ tục/mã của một số loại và gọi thích hợp. Trong khi một tuyên bố chuyển đổi sẽ không mở rộng tốt nếu bạn cần nhiều lựa chọn, cho ba nó sẽ khá đơn giản - đây là một ý tưởng, mặc dù tôi chắc chắn ý tưởng này có thể được triển khai tốt hơn:

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" 

Đầu ra:

Starting 
One 
Two 
0

một cách tiếp cận trực tiếp hơn là sử dụng một loạt các if báo cáo, do đó bất kỳ chức năng helper có thể được sử dụng độc lập mà không cần phải tham khảo chéo các bước khác.

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

Cũng lưu ý rằng một tuyên bố switch sẽ tiếp tục đánh giá điều kiện cho đến khi nó gặp một tuyên bố break, vì vậy hình thức này cũng sẽ làm việc:

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

'Done!' 
1

câu trả lời thêm Đây có lẽ là quá nhiều cho nhiệm vụ đặc biệt này . Nhưng có thể hữu ích khi biết về công cụ. Nó có thể được sử dụng cho các tác vụ tương tự và phức tạp hơn.

Công cụ này là Invoke-Build.ps1. Đây là một tập lệnh độc lập, chỉ cần đặt nó ở bất kỳ đâu trên đường dẫn, đây là nó. Sau đó sử dụng mã như thế này:

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 

Sự khác biệt giữa điều này và câu trả lời trước là với công việc cách tiếp cận các khối mã thực tế không cần phải phụ thuộc rõ ràng, đó là gọi một số bước khác. Đây là cơ sở hạ tầng nhiệm vụ gắn kết các hành động với nhau.

Các vấn đề liên quan