ค้นหาเว็บไซต์

โมดูล PowerShell ในโลกแบบข้ามเวอร์ชัน


วันก่อน ฉันกำลังช่วยเพื่อนจัดเรียงคำถามที่เกี่ยวข้องกับโมดูล ขณะช่วยเขา ฉันรู้ว่าคำถามและปัญหาของเขาไม่เหมือนกัน ตอนนี้พวกเราหลายคนใช้ Windows PowerShell 7 ควบคู่กัน อะไรคือผลกระทบเมื่อใช้โมดูล PowerShell “gotchas” ที่มีศักยภาพคืออะไร? และคุณจะทำอย่างไรเพื่อลดโอกาสเกิดปัญหา?

PowerShellGet

ทั้ง Windows PowerShell และ PowerShell อาศัยคำสั่งของโมดูล เช่น Find-Module และ Install-Module อย่างไรก็ตาม หากคุณต้องการรองรับโมดูลข้ามเวอร์ชัน คุณอาจต้องปฏิบัติตามข้อกำหนดที่สำคัญ อย่างไรก็ตาม ให้ใช้ Windows PowerShell เพื่อรันคำสั่งเหล่านี้ทั้งหมด เว้นแต่จะระบุไว้เป็นอย่างอื่น

เปิด Windows PowerShell และเรียกใช้

Get-Module powershellget -ListAvailable

หากเวอร์ชันเดียวที่คุณเห็นคือ 1.0.0.1 คุณจะต้องอัปเดตโมดูล โมดูล PowerShellGet เป็นที่ที่คุณได้รับคำสั่งของโมดูล และในโลกข้ามเวอร์ชัน คุณจะต้องใช้โมดูลเวอร์ชันที่ใหม่กว่า

อย่างไรก็ตาม คุณไม่สามารถวิ่งง่ายๆ ได้

Update-Module PowerShellGet

หากคุณทำเช่นนั้น คุณจะได้รับข้อผิดพลาด เวอร์ชัน 1.0.0.1 เป็นโมดูล ระบบ ที่มาพร้อมกับ Windows 10 เวอร์ชันของคุณ ไม่ได้รับการติดตั้งในลักษณะดั้งเดิม แต่ไม่มีปัญหา คุณยังสามารถติดตั้งได้

Install-Module PowerShellGet -Force -Repository PSGallery

ฉันรัดกุมมากในคำสั่งในการติดตั้งเวอร์ชัน Microsoft มาตรวจสอบกัน

Remove-Module PowerShellGet -ErrorAction Ignore
Import-Module PowerShellGet
Get-Module PowerShellGet

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

PSModulePath

ส่วนถัดไปของปริศนาคือตัวแปรสภาพแวดล้อมที่เรียกว่า %PSModulePath% ตัวแปรนี้ประกอบด้วยตำแหน่งทั้งหมดที่ PowerShell และ Windows PowerShell ค้นหาโมดูล นี่คือสิ่งที่ทำให้โมดูลโหลดอัตโนมัติได้ นี่คือจุดที่น่าสนใจ

นี่คือตัวแปรของฉันในการติดตั้ง Windows 10 ใหม่ทั้งหมด

ฉันแยกเส้นทางบน “;” ตัวคั่นเพื่อให้อ่านง่ายขึ้น มีสถานที่เริ่มต้น 3 แห่ง หนึ่งครั้งสำหรับผู้ใช้ปัจจุบัน หนึ่งรายการสำหรับผู้ใช้ทั้งหมด และอีกหนึ่งรายการสำหรับโมดูลระบบ โดยส่วนใหญ่ เราจะเพิกเฉยต่อสิ่งใดๆ ในเส้นทางของระบบ เมื่อคุณติดตั้งโมดูลใหม่ โมดูลจะไปในเส้นทางผู้ใช้และผู้ใช้ทั้งหมด เพิ่มเติมเกี่ยวกับเรื่องนั้นในอีกสักครู่

นี่คือสิ่งเดียวกันใน PowerShell 7.1

อีกวิธีหนึ่งในการพิจารณาเส้นทางของระบบคืออยู่ภายใต้ $PSHome ดูชัด ๆ. PowerShell 7 ยังรู้เกี่ยวกับระบบ Windows PowerShell และตำแหน่งผู้ใช้ทั้งหมด! ซึ่งหมายความว่า PowerShell สามารถ "ดู" โมดูลที่ติดตั้งโดย Windows PowerShell อย่างไรก็ตาม Windows PowerShell ไม่สามารถ "เห็น" สิ่งใด ๆ ที่ติดตั้งโดย PowerShell

ติดตั้งโมดูล

ตอนนี้หวังว่าจะชัดเจนแล้ว มาติดตั้งโมดูลบางส่วนกันดีกว่า ใน PowerShell ฉันจะติดตั้งโมดูลที่ฉันรู้ว่าใช้งานได้เฉพาะใน PowerShell 7.x

install-module Bluebirdps -Scope AllUsers -force

สังเกตพารามิเตอร์ -Scope ตามค่าเริ่มต้น โมดูลที่ติดตั้งจะเป็นแบบต่อผู้ใช้ แต่ในกรณีนี้ ฉันต้องการติดตั้งโมดูลสำหรับผู้ใช้ทั้งหมด ซึ่งหมายความว่าบัญชีที่ใช้ในการติดตั้งโมดูลจำเป็นต้องมีสิทธิ์ของผู้ดูแลระบบในไฟล์ C:\Program นี่คือสาเหตุว่าทำไมค่าเริ่มต้นจึงเป็นตำแหน่งของผู้ใช้ — เพื่อหลีกเลี่ยงความจำเป็นในการใช้ข้อมูลประจำตัวของผู้ดูแลระบบ ขณะที่ฉันอยู่ที่นั่น ฉันจะติดตั้งโมดูลอื่นใน PowerShell 7

Install-Module PSReleaseTools -force

ใน Windows PowerShell ฉันจะติดตั้งโมดูลสำหรับผู้ใช้ทั้งหมดและอีกโมดูลหนึ่งใช้ขอบเขตเริ่มต้น

Install-Module PSScriptTools -Scope AllUsers -force
Install-Module WTToolbox -force

รับ-ติดตั้งโมดูล

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

คุณสามารถดูได้จากตำแหน่งที่โมดูลหนึ่งมีไว้สำหรับผู้ใช้และอีกโมดูลหนึ่งสำหรับผู้ใช้ทั้งหมด โปรดสังเกตว่าไม่มีโมดูลจาก Windows PowerShell

นี่เป็นสิ่งเดียวกันจากฝั่ง Windows PowerShell

ไม่มีสิ่งใดจาก PowerShell 7 ปรากฏขึ้น แต่มีสิ่งหนึ่งที่สำคัญที่ฉันอยากจะชี้ให้เห็น ก่อนหน้านี้ ฉันติดตั้งโมดูล WTToolBox โดยไม่ระบุขอบเขต ค่าเริ่มต้นคือขอบเขตผู้ใช้แต่ดูที่ตำแหน่ง นี่คือสิ่งที่เกิดขึ้น ฉันใช้ Windows PowerShell ในฐานะผู้ดูแลระบบ กล่าวคือ ในเซสชันที่มีการยกระดับ ในบริบทนี้ “ผู้ใช้” จะเหมือนกับ “ผู้ใช้ทั้งหมด” ในบางแง่นั่นเป็นสิ่งที่ดีเพราะโมดูล Windows PowerShell ใดๆ ที่ติดตั้งสำหรับผู้ใช้ทุกคนสามารถใช้ใน PowerShell 7.x ได้ โดยถือว่ามีความเข้ากันได้

สิ่งสำคัญ #1: Get-InstalledModule แสดงเฉพาะโมดูลที่ติดตั้งตามเวอร์ชัน PowerShell

ประเด็นสำคัญ #2: การติดตั้งโมดูลในฐานะผู้ใช้ระดับสูงจะติดตั้งโมดูลสำหรับผู้ใช้ทุกคนเสมอ

รับโมดูล

แล้วคุณจะ "ดู" ว่ามีโมดูลอะไรบ้าง? ใช้รับโมดูล ตามค่าเริ่มต้น โมดูลจะแสดงเฉพาะโมดูลที่โหลดในปัจจุบันเท่านั้น พารามิเตอร์สำคัญที่คุณต้องจำคือ -ListAvailable

รับโมดูลค้นหาตำแหน่ง PSModulePath ซึ่งเป็นเหตุผลว่าทำไมจึงใช้งานได้ใน PowerShell 7 หากต้องการ "ดู" ทุกอย่างที่ทำงาน:

Get-Module -listavailable

นี่เป็นข้อมูลโค้ดเล็กๆ น้อยๆ สำหรับโมดูลที่มีอยู่

$p = $env:PSModulePath -split ";"
 $m = Get-Module -ListAvailable
 foreach ($loc in $p) {
     [pscustomobject]@{
         Location = $loc
         Modules = ($m | where {$_.path -match $loc.replace("\","\\") } ).count
     }   
 }

นี่คือการรวมผลลัพธ์จาก PowerShell ทั้งสองเวอร์ชัน

สิ่งสำคัญ #3: หากคุณต้องการใช้โมดูลทั้งใน Windows PowerShell และ PowerShell 7.x ให้ติดตั้งโมดูลสำหรับผู้ใช้ทั้งหมดใน Windows PowerShell

สรุป

ฉันหวังว่าคำแนะนำนี้จะช่วยไขปริศนาหรือความสับสนออกไปได้ ก่อนที่คุณจะไปให้ฉันพูดถึงบางสิ่ง ประการแรก เพียงเพราะ PowerShell สามารถ “เห็น” โมดูล Windows PowerShell ได้ จึงไม่รับประกันว่าจะใช้งานได้ อย่าปล่อยให้สิ่งนี้ขัดขวางคุณ โมดูล Windows PowerShell ส่วนใหญ่ทำงานได้ดีใน PowerShell สิ่งที่ไม่น่าจะล้มเหลวเนื่องจากการพึ่งพา .NET ที่ไม่ได้รับการสนับสนุนใน .NET Core ซึ่งเป็นสิ่งที่ PowerShell กำลังทำงานอยู่

ประการที่สอง ตัวแปร PSModulePath ของคุณอาจแตกต่างกัน คุณอาจมีตำแหน่งเพิ่มเติม ขึ้นอยู่กับแอปพลิเคชันหรือโปรแกรมที่คุณติดตั้ง บนเดสก์ท็อปหลักของฉัน ฉันติดตั้ง SQL Server Express แล้ว ดังนั้นตัวแปรของฉันจึงรวม C:\Program Files (x86)\Microsoft SQL Server\150\Tools\PowerShell\Modules\

ในทางเทคนิค คุณสามารถแก้ไขตัวแปรสภาพแวดล้อมหรือปรับตำแหน่งด้วยสคริปต์โปรไฟล์ได้ คุณอาจทำเช่นนี้ถ้าคุณต้องการรวมตำแหน่งที่กำหนดเอง แต่ฉันขอแนะนำไม่ให้อัปเดตตัวแปรเพื่อให้ Windows PowerShell สามารถ “ดู” ตำแหน่งโมดูล PowerShell ได้ ฉันทำงานภายใต้สมมติฐานที่ว่าหากติดตั้งโมดูลใน PowerShell จะต้องใช้พลังงาน PowerShell ตัวอย่างเช่น ฉันติดตั้งโมดูล BluebirdPS ใน PowerShell ถ้าฉันแก้ไขสิ่งต่าง ๆ เพื่อให้สามารถนำเข้าไปยัง Windows PowerShell ได้ ก็มีแนวโน้มที่จะล้มเหลว หากคุณต้องการให้โมดูลทำงานข้ามเวอร์ชัน ให้ติดตั้งโมดูลเหล่านั้นใน Windows PowerShell สำหรับผู้ใช้ทั้งหมด

ฉันขอแนะนำให้คุณอัปเดต PowerShellGet จากนั้นใช้เวลาสักครู่ในการอ่านความช่วยเหลือและตัวอย่างสำหรับคำสั่งโมดูล

บทความที่เกี่ยวข้อง