2013-09-26 56 views
6

Tôi đang viết kịch bản PowerShell của mình bằng Windows PowerShell ISE. Khi tôi thay đổi đôi chút trong kịch bản và chạy tập lệnh, không phải phiên bản được lưu cuối cùng của tập lệnh được thực thi nhưng tập lệnh cũ hơn. Chỉ khi tôi chạy tập lệnh lần thứ hai, nó sử dụng phiên bản hiện tại. Tôi có thể làm gì để luôn chạy phiên bản mới nhất của tập lệnh?Windows PowerShell ISE đang chạy phiên bản cũ

Trả lời

1

Sau khi thực hiện chỉnh sửa, bạn cần phải nguồn lại tập lệnh bằng dấu chấm tìm nguồn cung ứng. Giả sử bạn có một file có tên MyScript.ps1 trong thư mục hiện hành, trong giao diện điều khiển bạn hãy chạy lệnh dưới đây:

. .\MyScript.ps1 

Nếu bạn muốn gọi một chức năng cụ thể trong kịch bản sau đó bạn chỉ có thể làm:

. .\MyScript.ps1 
MyFunction 
1

Đây là một câu hỏi rất cũ, nhưng tôi nghĩ rằng tôi đã tình cờ gặp vấn đề tương tự. Trong trường hợp của tôi, tôi đã định nghĩa một hàm sau khi gọi nó. Nó xuất hiện để làm việc, nhưng chỉ vì "myfunc" vẫn có giá trị từ lời gọi trước đó. Nếu bạn thay đổi "Xin chào, Thế giới!", Bạn sẽ thấy rằng giá trị mới chỉ ảnh hưởng đến lần thử thứ hai.

Invoke-Command -ScriptBlock ${function:myfunc} 

function myfunc() { 
    Write-Host "Hello, World!" 
} 

Để giải quyết vấn đề này, chỉ cần xác định các chức năng trước bạn cố gắng để gọi nó.

function myfunc() { 
    Write-Host "Hello, World!" 
} 

Invoke-Command -ScriptBlock ${function:myfunc} 
0

Kinh nghiệm của tôi với ISE "bộ nhớ đệm" của các tập tin cũ:

Hành vi của ISE là khác nhau cho các module PS (.psm1) và các kịch bản PS đơn giản (ps1). Tôi đang sử dụng PS & ISE với Win10Pro.

A) Kinh nghiệm của tôi với các module (PSM1)

  1. tải một tập tin mô-đun "hello.psm1" đã được đặt trong một module thích hợp thư mục "C:. \ Users \ myusername \ Documents \ WindowsPowerShell \ modules \ Xin chào" bằng ISE
  2. thực hiện một chức năng của "Run Selection"(bạn có thể không thực hiện module bởi "Run Script")
  3. Sửa đổi các tập tin, ví dụ như đầu ra của hàm 'Viết-Máy chủ' Xin chào thế giới! '' thành 'Viết-Máy chủ "Xin chào"' và lưu tệp .
  4. Thực hiện chức năng bằng "Chạy lựa chọn" và nó sẽ thực thi chức năng cũ , với đầu ra cũ, ví dụ: "Chào thế giới!". Điều này cũng đúng nếu tôi lặp lại lệnh "Chạy lựa chọn".
  5. Chỉ khi tôi rời ISE và tải lại, chức năng mới được thực hiện bằng "Chạy lựa chọn".

B) Trải nghiệm của tôi với tập lệnh (.PS1).

  1. Nếu tôi thực thi "Chạy lựa chọn", hành vi tương tự như với mô-đun.
  2. Nếu tôi thực hiện một lần "Chạy tập lệnh" và do đó chức năng được gọi, phiên bản hiện tại của hàm được thực thi. Tất nhiên tôi gọi hàm (ví dụ: trên dòng số 100) trong tệp "sau" được xác định (ví dụ: trong dòng 10-20). Bằng cách này, không có bộ nhớ đệm.
  3. Đặc biệt và do đó, nếu tôi thực hiện một lần "Chạy tập lệnh", trong khi mã thực hiện không gọi hàm, và sau đó thực hiện chức năng của tôi bằng "Chạy lựa chọn", phiên bản hiện tại của hàm được thực thi.

C) Dưới đây là cách giải quyết của tôi để làm phát triển mô-đun thoải mái hơn:

  • Simple kịch bản có thể được thực hiện bởi "kịch bản Chạy".
  • Nếu tôi muốn phát triển một mô-đun (.PSM1), tôi đặt tên nó là tập lệnh đơn giản (.PS1) trong giai đoạn phát triển. Tôi đặt tệp (ví dụ: "hello.ps1") đã có trong thư mục mô-đun thích hợp, ví dụ: "C: \ Users \ MyUserName \ Documents \ WindowsPowerShell \ Modules \ Xin chào" cho mô-đun "Xin chào". Tất nhiên điều này tôi không thể thực hiện các chức năng như các chức năng mô-đun từ bảng điều khiển PowerShell. Tôi chỉ muốn sử dụng ISE để gọi hàm để kiểm tra.
  • Vì mô-đun không được thực thi dưới dạng tập lệnh, không có mã thực thi trong tệp, nhưng chỉ có chức năng (AFAIK). Vì vậy, tôi có thể thực hiện một cách an toàn "Chạy tập lệnh" trên tập lệnh của tôi.

Vì vậy, nếu tôi sửa đổi tệp mô-đun trong phát triển ISE, trước tiên tôi thực thi "Chạy tập lệnh", trước khi tôi thực hiện chức năng bằng "Chạy lựa chọn".

Bằng cách này, tôi luôn thực hiện phiên bản hiện tại của hàm.

Mặc dù vấn đề của tôi hơi khác một chút, câu hỏi này và câu trả lời rất hữu ích cho tôi để tìm một giải pháp. Thật khó để tìm thấy những câu hỏi như vậy về ISE "caching" và câu trả lời hữu ích như vậy.

Trân trọng Rolf