เหตุใด PowerShell ISE จึงไม่แยกตัวแปรสคริปต์เข้ากับขอบเขตสคริปต์


12

ใน PowerShell การกำหนดขอบเขตควรเก็บวัตถุ (ตัวแปรนามแฝงฟังก์ชัน ฯลฯ ) ในสคริปต์ไม่ให้ส่งผลกระทบต่อสภาพแวดล้อมแบบโกลบอล สิ่งนี้ดูเหมือนว่าจะทำงานได้ดีที่บรรทัดคำสั่ง แต่ไม่ใช่ใน ISE

นี่คือการสาธิตในคอนโซล ฉันตรวจสอบเพื่อดู$xว่าไม่ได้กำหนดไว้ในขอบเขตส่วนกลางแสดงเนื้อหาของScopeTest.ps1แล้วเรียกใช้และสุดท้ายฉันตรวจสอบเพื่อดูว่า$xมีการกำหนดอีกครั้งหรือไม่ ตามที่คาดหวัง$xถูกสร้างและใช้งานภายในขอบเขตของสคริปต์เท่านั้นและไม่คงอยู่ในสภาพแวดล้อมโกลบอลหลังจากสคริปต์สิ้นสุดลง

ป้อนคำอธิบายรูปภาพที่นี่

ใน ISE สิ่งนี้จะปรากฏขึ้นหากสคริปต์ถูกเรียกโดยใช้หน้าต่างคอนโซล

ป้อนคำอธิบายรูปภาพที่นี่

อย่างไรก็ตามถ้าฉันใช้ปุ่ม "เรียกใช้สคริปต์" หรือ F5 จริง ๆ แล้วตัวแปรภายในสคริปต์จะยังคงมีอยู่หลังจากเสร็จสิ้น

ป้อนคำอธิบายรูปภาพที่นี่

วิธีนี้อาจทำให้การเขียนและการแก้ไขปัญหาเป็นเรื่องยากหากสคริปต์สมมติว่าจะเริ่มต้นจากสภาพแวดล้อมที่สะอาด (เช่น: ตัวแปรใด ๆ ที่ตั้งไว้ภายในสคริปต์ไม่ควรมีอยู่) เหตุใด ISE จึงทำงานในลักษณะนี้

คำตอบสำหรับคำถามนี้แตะที่หัวข้อเพียงเล็กน้อยกล่าวถึง "การจัดหาดอท" แต่ฉันหวังว่าจะได้คำอธิบายที่ละเอียดยิ่งขึ้นที่นี่ นอกจากนี้หากเอกสารมีอยู่ว่าทำไมสคริปต์ถูกเรียกใช้ใน ISE แตกต่างจากคอนโซลการอ้างอิงก็จะดีเช่นกัน

คำตอบ:


9

ในตัวอย่างสคริปต์ของคุณคุณสร้างตัวแปรและคุณไม่ได้ทำลายมันในตอนท้ายของสคริปต์ ISE สร้างตัวอย่างสดของ powershell ซึ่งโหลดและรันสคริปต์เมื่อคุณคลิกเรียกใช้ ความแตกต่างคือเปลือกรวมสามารถดำเนินการต่อสคริปต์ สิ่งนี้เหมาะสำหรับการดีบักสภาพแวดล้อมและการสร้างสคริปต์ตามที่คุณไป วิธีนี้คุณไม่จำเป็นต้องเรียกใช้สคริปต์ซ้ำไปซ้ำมา (มีสถานการณ์ที่สิ่งนี้ไม่เหมาะ) เพื่อให้แน่ใจว่าโค้ดบรรทัดต่อไปทำงานได้ดี คุณพิมพ์ลงในเปลือกและถ้ามันใช้งานได้คุณเพิ่มมันลงในส่วนของสคริปต์

พฤติกรรมนี้อาจอธิบายได้ดีที่สุดที่นี่: http://technet.microsoft.com/en-us/library/dd819480.aspx

ส่วนที่เกี่ยวข้อง:

บานหน้าต่างทั้งหมดใน ISE จะอยู่ในขอบเขตเดียวกันเสมอ

หากคุณไม่ต้องการให้ตัวแปรของคุณอาศัยอยู่ในเชลล์หลังจากสคริปต์ของคุณเสร็จสิ้นคุณควรจะใช้ตัวแปรRemove-Variableเหล่านั้น

ตัวอย่างเช่น:

Remove-Variable x

คุณสามารถเพิ่มอินสแตนซ์ "clean" ของ powershell ให้กับ ISE ได้โดยคลิกไฟล์ -> แท็บ Powershell ใหม่


2

ใน ISE Powershell จะทำการทิ้งสคริปต์ไปยังเชลล์แล้วจึงเรียกใช้งาน ราวกับว่าคุณพิมพ์ออกมาในเปลือกแล้วดำเนินการมัน ดังนั้นตัวแปรจึงพร้อมใช้งานสำหรับเซสชันนั้น หากต้องการดูความแตกต่างอื่น ๆ ลองดูที่โพสต์MSDN


ฉันไม่เห็นอะไรเลยในโพสต์ที่เชื่อมโยงถึงพฤติกรรมนี้
Iszi

0

ดังนั้น ISE จึงถูกกำหนดขอบเขตเป็นโกลบอล นอกจากว่าคุณจะลบตัวแปรทั้งหมดที่สร้างขึ้นในขณะที่ทำงานใน ISE ตัวแปรทั้งหมดจะพร้อมใช้งานหลังจากสคริปต์ทำงาน เมื่อฉันใช้ ISE เพื่อสร้างสคริปต์ของฉันฉันจะทดสอบกับ PowerShell console ที่เปิดอยู่เสมอ สิ่งนี้ทำให้ฉันมั่นใจได้ว่าทุกอย่างทำงานได้ตามที่ฉันต้องการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.