Tại sao PowerShell ISE không tách các biến tập lệnh thành phạm vi tập lệnh?


12

Trong PowerShell, phạm vi được cho là giữ cho các đối tượng (biến, bí danh, hàm, v.v.) trong các tập lệnh không ảnh hưởng đến môi trường toàn cầu. Điều này dường như hoạt động tốt ở dòng lệnh, nhưng không phải trong ISE.

Đây là một cuộc biểu tình trong giao diện điều khiển. Tôi kiểm tra xem nó $xkhông được xác định trong phạm vi toàn cầu, hiển thị nội dung ScopeTest.ps1và sau đó chạy nó, và cuối cùng tôi kiểm tra xem liệu $xcó được xác định lại không. Như mong đợi, $xchỉ được tạo và sử dụng trong phạm vi của tập lệnh và không tồn tại trong môi trường toàn cầu sau khi tập lệnh kết thúc.

nhập mô tả hình ảnh ở đây

Trong ISE, điều này dường như hoạt động nếu tập lệnh được gọi bằng cửa sổ giao diện điều khiển.

nhập mô tả hình ảnh ở đây

Tuy nhiên, nếu tôi thực sự sử dụng nút "Run Script" hoặc F5, các biến trong tập lệnh sẽ tồn tại sau khi hoàn thành.

nhập mô tả hình ảnh ở đây

Điều này có thể làm cho việc viết và xử lý sự cố các kịch bản hơi khó khăn, nếu tập lệnh giả định rằng nó sẽ bắt đầu từ một môi trường sạch (nghĩa là: Bất kỳ biến nào được đặt trong tập lệnh sẽ không tồn tại.). Tại sao ISE hành xử theo cách này?

Một câu trả lời cho câu hỏi này chỉ chạm vào chủ đề một chút, đề cập đến "nguồn cung cấp dấu chấm", nhưng tôi hy vọng sẽ có được một lời giải thích kỹ lưỡng hơn ở đây. Ngoài ra, nếu tài liệu tồn tại về lý do tại sao tập lệnh được chạy khác nhau trong ISE so với bảng điều khiển, thì một tham chiếu cũng sẽ rất hay.

Câu trả lời:


9

Trong các ví dụ về tập lệnh của bạn, bạn đã tạo các biến và bạn đã không hủy chúng ở cuối tập lệnh của mình. ISE tạo một thể hiện trực tiếp của powershell để tải và chạy tập lệnh khi bạn bấm chạy. Sự khác biệt là shell tích hợp có thể tiếp tục tập lệnh. Điều này là lý tưởng để gỡ lỗi môi trường và để tạo tập lệnh khi bạn đi. Bằng cách này, bạn không phải tiếp tục chạy tập lệnh của mình nhiều lần (có những tình huống điều này không lý tưởng) để đảm bảo dòng mã tiếp theo hoạt động. Bạn gõ nó vào shell và nếu nó hoạt động, bạn thêm nó vào phần script.

Hành vi này có lẽ được mô tả tốt nhất ở đây: http://technet.microsoft.com/en-us/l Library / dd819480.aspx

Trích đoạn có liên quan:

Tất cả các pan trong ISE luôn trong cùng một phạm vi.

Nếu bạn không muốn các biến của mình sống trong trình bao sau khi tập lệnh của bạn đã hoàn thành thì bạn nên thực hiện Remove-Variablechúng.

Ví dụ:

Remove-Variable x

Bạn có thể thêm một thể hiện quyền hạn "sạch" vào ISE bằng cách nhấp vào Tệp-> Tab Powershell mới


2

Trong ISE Powershell về cơ bản là bỏ tập lệnh vào trình bao và sau đó chạy nó. Như thể bạn gõ nó trong shell, sau đó thực thi nó. Vì vậy, biến có sẵn cho phiên đó. Để xem sự khác biệt khác, hãy xem bài viết MSDN này .


Tôi không thấy bất cứ điều gì trong bài đăng được liên kết giải quyết hành vi này.
Iszi

0

vì vậy ISE có phạm vi toàn cầu. Trừ khi bạn loại bỏ tất cả các biến được tạo trong khi làm việc trong ISE, tất cả các biến sẽ có sẵn sau khi tập lệnh chạy. Khi tôi sử dụng ISE để xây dựng tập lệnh của mình, tôi sẽ luôn kiểm tra với bảng điều khiển PowerShell khác đang mở. Điều này cho phép tôi đảm bảo mọi thứ hoạt động như tôi dự định.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.