2014-12-08 21 views
10

Sao chép và dán đoạn mã sau vào một kịch bản mới Powershell ISE và nhấn F5:Hiểu phạm vi chức năng trong công việc PowerShell

workflow workflow1{ 
    "in workflow1" 
    func1 
} 
function func1 { 
    "in func1" 
    func2 
} 
function func2 { 
    "in func2" 
} 
workflow1 

lỗi tôi nhận được là:

Thuật ngữ 'Func2' là không được công nhận là tên của lệnh ghép ngắn, chức năng, tệp tập lệnh hoặc chương trình có thể hoạt động

Tôi không hiểu điều này. Tại sao func1 lại nằm trong phạm vi chứ không phải func2? Bất kỳ trợ giúp nào được đánh giá cao. TIA.

+0

Điều này thật thú vị. Nếu tôi đã đoán nó sẽ là do 'Func1' được gọi từ bên trong định nghĩa dòng công việc trực tiếp nhưng' func2' thì không. Từ đọc về xử lý dòng công việc có vẻ như là một số hạn chế về làm việc giữa các phạm vi. – JNK

Trả lời

9

Hãy suy nghĩ về quy trình làm việc như các yếu tố lập trình tầm nhìn ngắn.

Luồng công việc không thể thấy ngoài những gì có sẵn ngay trong phạm vi. Vì vậy, các hàm lồng nhau không hoạt động với một luồng công việc duy nhất, bởi vì nó không thể nhìn thấy chúng.

Khắc phục là để lồng luồng công việc cùng với hàm lồng nhau. Như thế này:

workflow workflow1 
{ 
    function func1 
    { 
     "in func1" 
     workflow workflow2 
     { 
      function func2 
      { 
       "in func2" 
      } 
      func2 
     } 
     "in workflow2" 
     workflow2 
    } 
    "in workflow1" 
    func1 
} 
workflow1 

Sau đó, nó thấy các chức năng lồng nhau:

in workflow1 
in func1 
in workflow2 
in func2 

Thông tin thêm về nó here

+2

Cảm ơn Micky. Tuy nhiên, tôi có những chức năng mà tôi muốn sử dụng trong các quy trình công việc khác nhau, nhưng bây giờ tôi không thể. Kinda đánh bại mục đích của chức năng IMO. – jamiet

1

Không thực sự là câu trả lời cho câu hỏi của bạn, nhưng có thêm một ca khúc để theo dõi. Đặt điều này trong một bình luận sẽ là quá dài.

Từ here:

Khi bạn chạy một tiến trình công việc kịch bản, Windows PowerShell phân tích các kịch bản thành một cây cú pháp trừu tượng (AST). Sự hiện diện của từ khóa “workflow” khiến trình biên dịch script-to-workflow sử dụng AST này để tạo XAML, định dạng được yêu cầu bởi thời gian chạy Windows Workflow Foundation . Để tạo trải nghiệm người dùng tương tác với luồng công việc này, sau đó chúng tôi tạo một hàm bao bọc có cùng thông số - nhưng thay vào đó phối hợp thực hiện quy trình làm việc trong phạm vi điều hành PowerShell Workflow. Bạn có thể nhìn thấy cả các wrapper chức năng và XAML tạo ra bằng cách thực hiện:

Get-Command workflow1 |Format-List * 

tôi đã làm điều đó cho công việc cụ thể của bạn (xem workflow1 trong lệnh trên) và cả hai XAML và PowerShell mã được tạo ra là .. . hấp dẫn. Mã XAML không bao gồm bất kỳ tham chiếu nào đến func2, nhưng chứa tham chiếu đến func1.

+0

thú vị, bạn dường như được vào một cái gì đó David. Tôi sẽ tiếp tục đào – jamiet

+1

Nếu bạn gọi hàm 'Get-ChildItem: func *' trong luồng công việc, nó không liệt kê 'func1' hoặc' func2'. Dường như có rất nhiều [hạn chế dường như tùy ý trong quy trình công việc] (http://blogs.technet.com/b/heyscriptingguy/archive/2013/01/02/powershell-workflows-restrictions.aspx), nhưng nó không dường như không được tài liệu rất tốt. Ý tôi là, có một [tấn ví dụ] (http://technet.microsoft.com/en-us/library/jj574157.aspx), nhưng điều đó không giải thích cách mọi thứ hoạt động, đúng như vậy. [This] (http://blogs.technet.com/b/heyscriptingguy/archive/tags/workflow/) là tài nguyên tốt nhất mà tôi có thể tìm thấy. –

0

Để mơ hồ tóm tắt tất cả các câu trả lời, đừng thắc mắc tại sao nó cư xử theo cách này, chỉ chấp nhận nó và xử lý nó. Đủ công bằng.

Tôi đã viết toàn bộ đường dẫn triển khai không có quy trình làm việc Powershell và tôi muốn tối ưu hóa nó bằng cách sử dụng "foreach-parallel" của luồng công việc, tuy nhiên có vẻ như thuế phải làm như vậy và viết lại toàn bộ nội dung trong quy trình làm việc. Đó là một khoản thuế quá lớn để trả không may chỉ để có được một vòng lặp foreach song song.

Bài học kinh nghiệm - sử dụng quy trình làm việc của Powershell từ lúc bắt đầu.

0

Bạn có thể bao bọc các chức năng và cuộc gọi của chúng bên trong một InlineScript - có thể là một tập lệnh hệ thống. Sau đó chạy inlinescript đó bên trong một vòng lặp foreach -Parallel làm việc thông qua các hệ thống bạn muốn truy vấn.

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