ในอดีต ยูทิลิตี้บรรทัดคำสั่งบนระบบ Unix ได้รับการพัฒนาดีกว่าบน Windows แต่ด้วยการกำเนิดของโซลูชันใหม่ สถานการณ์ก็เปลี่ยนไป
Windows PowerShell ช่วยให้ผู้ดูแลระบบสามารถทำงานประจำส่วนใหญ่ได้โดยอัตโนมัติ ด้วยเครื่องมือนี้ คุณสามารถเปลี่ยนการตั้งค่า หยุดและเริ่มบริการ และดำเนินการบำรุงรักษาแอปพลิเคชันที่ติดตั้งส่วนใหญ่ได้ มันจะผิดถ้าจะมองว่าหน้าต่างสีน้ำเงินเป็นล่ามคำสั่งอื่น แนวทางนี้ไม่ได้สะท้อนถึงแก่นแท้ของนวัตกรรมที่ Microsoft เสนอ ในความเป็นจริงความเป็นไปได้ของ Windows PowerShell นั้นกว้างกว่ามาก: เราจะพยายามค้นหาว่าโซลูชันของ Microsoft แตกต่างจากเครื่องมือที่เราคุ้นเคยมากกว่าในบทความชุดสั้น ๆ อย่างไร
คุณสมบัติหลัก
แน่นอนว่า Windows PowerShell นั้นเป็นเชลล์การเขียนสคริปต์เป็นหลัก ซึ่งเดิมสร้างขึ้นบน .NET Framework และต่อมาบน .NET Core ต่างจากเชลล์ที่ยอมรับและส่งกลับข้อมูลข้อความ Windows PowerShell ทำงานร่วมกับคลาส .NET ที่มีคุณสมบัติและวิธีการ PowerShell ช่วยให้คุณสามารถรันคำสั่งทั่วไปและยังให้คุณสามารถเข้าถึงออบเจ็กต์ COM, WMI และ ADSI ใช้ที่เก็บข้อมูลต่าง ๆ เช่นระบบไฟล์หรือรีจิสทรีของ Windows เพื่อเข้าถึงสิ่งที่เรียกว่า ผู้ให้บริการ เป็นที่น่าสังเกตว่ามีความเป็นไปได้ในการฝังส่วนประกอบที่ปฏิบัติการได้ของ PowerShell ในแอปพลิเคชันอื่นเพื่อดำเนินการต่างๆ รวมถึง ผ่านอินเทอร์เฟซแบบกราฟิก สิ่งที่ตรงกันข้ามก็เกิดขึ้นเช่นกัน: แอปพลิเคชัน Windows จำนวนมากให้การเข้าถึงอินเทอร์เฟซการจัดการผ่าน PowerShell
Windows PowerShell ช่วยให้คุณ:
- เปลี่ยนการตั้งค่าระบบปฏิบัติการ
- จัดการบริการและกระบวนการ
- กำหนดค่าบทบาทและส่วนประกอบของเซิร์ฟเวอร์
- ติดตั้งซอฟต์แวร์
- จัดการซอฟต์แวร์ที่ติดตั้งผ่านอินเทอร์เฟซพิเศษ
- ฝังส่วนประกอบที่ปฏิบัติการได้ในโปรแกรมบุคคลที่สาม
- สร้างสคริปต์เพื่อทำให้งานการดูแลระบบเป็นแบบอัตโนมัติ
- ทำงานกับระบบไฟล์, รีจิสทรีของ Windows, ที่เก็บใบรับรอง ฯลฯ
สภาพแวดล้อมของเชลล์และการพัฒนา
มี Windows PowerShell ในสองรูปแบบ: นอกเหนือจากคอนโซลอีมูเลเตอร์ที่มีเชลล์คำสั่งแล้ว ยังมี Integrated Scripting Environment (ISE) หากต้องการเข้าถึงอินเทอร์เฟซบรรทัดคำสั่ง เพียงเลือกทางลัดที่เหมาะสมจากเมนู Windows หรือเรียกใช้ powershell.exe จากเมนู Run หน้าต่างสีน้ำเงินจะปรากฏขึ้นบนหน้าจอ ซึ่งแตกต่างอย่างเห็นได้ชัดในด้านความสามารถจาก cmd.exe ที่ต่อต้านลัทธิ มีการเติมข้อความอัตโนมัติและคุณสมบัติอื่น ๆ ที่ผู้ใช้เชลล์คำสั่งคุ้นเคยสำหรับระบบ Unix
ในการทำงานกับเชลล์ คุณต้องจำแป้นพิมพ์ลัดบางอย่าง:
- ลูกศรขึ้นและลงเลื่อนดูประวัติเพื่อทำซ้ำคำสั่งที่พิมพ์ไว้ก่อนหน้านี้
- ลูกศรขวาที่ท้ายบรรทัดจะพิมพ์อักขระคำสั่งก่อนหน้าซ้ำทีละอักขระ
- Ctrl+Home จะลบข้อความที่พิมพ์ออกจากตำแหน่งเคอร์เซอร์จนถึงจุดเริ่มต้นของบรรทัด
- Ctrl+End ลบข้อความจากเคอร์เซอร์จนถึงท้ายบรรทัด
F7 แสดงหน้าต่างพร้อมคำสั่งที่พิมพ์และให้คุณเลือกหนึ่งในนั้น คอนโซลยังใช้งานได้กับการเลือกข้อความด้วยเมาส์ คัดลอกวาง การวางตำแหน่งเคอร์เซอร์ การลบ แบ็คสเปซ - ทุกอย่างที่เราชอบ
Windows PowerShell ISE เป็นสภาพแวดล้อมการพัฒนาที่สมบูรณ์พร้อมด้วยตัวแก้ไขโค้ดแบบแท็บและแบบเน้นไวยากรณ์ ตัวสร้างคำสั่ง ตัวดีบักเกอร์ในตัว และความพึงพอใจในการเขียนโปรแกรมอื่นๆ หากคุณเขียนยัติภังค์หลังชื่อคำสั่งในตัวแก้ไขสภาพแวดล้อมการพัฒนา คุณจะได้รับตัวเลือกทั้งหมดที่มีอยู่ในรายการดรอปดาวน์พร้อมการระบุประเภท คุณสามารถเปิด PowerShell ISE ได้โดยใช้ทางลัดจากเมนูระบบ หรือใช้ไฟล์ปฏิบัติการ powershell_ise.exe
Cmdlet
ใน Windows PowerShell สิ่งที่เรียกว่า cmdlet เหล่านี้เป็นคลาส .NET เฉพาะทางที่มีฟังก์ชันการทำงานที่หลากหลาย มีชื่อว่า Action-Object (หรือ Verb-Noun หากคุณต้องการ) และลิงก์ที่คั่นด้วยยัติภังค์จะมีลักษณะคล้ายกับภาคแสดงและหัวเรื่องในประโยคภาษาธรรมชาติ ตัวอย่างเช่น Get-Help หมายถึง "Get-Help" อย่างแท้จริง หรือในบริบทของ PowerShell: "Show-Help" อันที่จริงนี่เป็นอะนาล็อกของคำสั่ง man ในระบบ Unix และต้องขอคู่มือใน PowerShell ด้วยวิธีนี้และไม่ใช่โดยการเรียก cmdlets ด้วยปุ่ม --help หรือ /? อย่าลืมเกี่ยวกับเอกสาร PowerShell ออนไลน์: Microsoft มีรายละเอียดค่อนข้างมาก
นอกจาก Get แล้ว cmdlets ยังใช้กริยาอื่นเพื่อแสดงถึงการกระทำ (และไม่ใช่แค่กริยาเท่านั้น พูดอย่างเคร่งครัด) ในรายการด้านล่าง เราจะยกตัวอย่างบางส่วน:
Add
- เพิ่ม;
Clear
- ชัดเจน;
Enable
- เปิด;
Disable
- ปิดสวิตช์;
New
- สร้าง;
Remove
- ลบ;
Set
- ถาม;
Start
- วิ่ง;
Stop
- หยุด;
Export
- ส่งออก;
Import
- นำเข้า
มีระบบ ผู้ใช้ และ cmdlet เสริม: ผลจากการดำเนินการ ทั้งหมดนี้ส่งคืนออบเจ็กต์หรืออาร์เรย์ของออบเจ็กต์ ไม่คำนึงถึงขนาดตัวพิมพ์ เช่น จากมุมมองของล่ามคำสั่ง ไม่มีความแตกต่างระหว่าง Get-Help และ get-help อักขระ ';' ใช้สำหรับการแยก แต่จำเป็นต้องใส่เฉพาะเมื่อมีการดำเนินการ cmdlets หลายรายการในบรรทัดเดียวกัน
cmdlet ของ Windows PowerShell ถูกจัดกลุ่มเป็นโมดูล (NetTCPIP, Hyper-V ฯลฯ) และมี Get-Command cmdlet เพื่อค้นหาตามวัตถุและการดำเนินการ คุณสามารถแสดงความช่วยเหลือได้ดังนี้:
Get-Help Get-Command
ตามค่าเริ่มต้น คำสั่งจะแสดงวิธีใช้สั้นๆ แต่พารามิเตอร์ (อาร์กิวเมนต์) จะถูกส่งผ่านไปยัง cmdlets ตามต้องการ ด้วยความช่วยเหลือของพวกเขา คุณสามารถรับความช่วยเหลือโดยละเอียด (พารามิเตอร์ - รายละเอียด) หรือความช่วยเหลือแบบเต็ม (พารามิเตอร์ - เต็ม) รวมถึงตัวอย่างการแสดงผล (พารามิเตอร์ - ตัวอย่าง):
Get-Help Get-Command -Examples
วิธีใช้ใน Windows PowerShell ได้รับการอัปเดตโดย Update-Help cmdlet หากบรรทัดคำสั่งยาวเกินไป อาร์กิวเมนต์ cmdlet สามารถย้ายไปยังบรรทัดถัดไปได้โดยการเขียนอักขระบริการ "`" แล้วกด Enter - เพียงแค่เขียนคำสั่งในบรรทัดหนึ่งให้เสร็จและดำเนินการต่อในบรรทัดอื่นจะไม่ทำงาน
นี่คือตัวอย่างบางส่วนของ cmdlet ทั่วไป:
Get-Process
- แสดงกระบวนการทำงานในระบบ
Get-Service
— แสดงบริการและสถานะ;
Get-Content
- แสดงเนื้อหาของไฟล์
สำหรับ cmdlets และยูทิลิตี้ภายนอกที่ใช้บ่อย Windows PowerShell มีคำพ้องความหมายสั้น ๆ - นามแฝง (จากภาษาอังกฤษ นามแฝง) ตัวอย่างเช่น dir เป็นนามแฝงสำหรับ Get-ChildItem รายการคำพ้องความหมายยังรวมถึงคำสั่งแบบอะนาล็อกจากระบบ Unix (ls, ps ฯลฯ ) และ Get-Help cmdlet ถูกเรียกโดยคำสั่ง help รายการคำพ้องความหมายทั้งหมดสามารถดูได้โดยใช้ Get-Alias cmdlet:
สคริปต์ ฟังก์ชัน โมดูล และภาษา PowerShell
สคริปต์ Windows PowerShell จะถูกจัดเก็บเป็นไฟล์ข้อความธรรมดาที่มีนามสกุล .ps1 คุณไม่สามารถเปิดใช้งานได้ด้วยการดับเบิลคลิก: คุณต้องคลิกขวาเพื่อเรียกเมนูบริบทและเลือกรายการ "Run in PowerShell" จากคอนโซล คุณจะต้องระบุเส้นทางแบบเต็มไปยังสคริปต์ หรือไปที่ไดเร็กทอรีที่เหมาะสมและเขียนชื่อไฟล์ การเรียกใช้สคริปต์ยังถูกจำกัดโดยนโยบายระบบ และหากต้องการตรวจสอบการตั้งค่าปัจจุบัน คุณสามารถใช้ Get-ExecutionPolicy cmdlet ซึ่งจะส่งคืนค่าใดค่าหนึ่งต่อไปนี้:
Restricted
— สคริปต์เรียกใช้งานถูกปิดใช้งาน (โดยค่าเริ่มต้น)
AllSigned
- อนุญาตให้เปิดตัวสคริปต์ที่ลงนามโดยนักพัฒนาที่เชื่อถือได้เท่านั้น
RemoteSigned
- อนุญาตให้เรียกใช้สคริปต์ที่ลงนามและเป็นเจ้าของ
Unrestricted
- อนุญาตให้เรียกใช้สคริปต์ใด ๆ
ผู้ดูแลระบบมีสองตัวเลือก วิธีที่ปลอดภัยที่สุดเกี่ยวข้องกับการลงนามสคริปต์ แต่นี่เป็นเวทย์มนตร์ที่ร้ายแรง - เราจะจัดการกับมันในบทความต่อๆ ไป ตอนนี้เรามาดูเส้นทางที่มีการต่อต้านน้อยที่สุดและเปลี่ยนนโยบาย:
Set-ExecutionPolicy RemoteSigned
PowerShell จะต้องทำงานในฐานะผู้ดูแลระบบจึงจะทำเช่นนี้ได้ แม้ว่าคุณจะเปลี่ยนนโยบายสำหรับผู้ใช้ปัจจุบันได้ด้วยการตั้งค่าพิเศษก็ตาม
สคริปต์ถูกเขียนในภาษาโปรแกรมเชิงวัตถุ คำสั่งต่างๆ ได้รับการตั้งชื่อตามหลักการเดียวกันกับ cmdlets ที่กล่าวถึงก่อนหน้านี้: “Action-Object” (“กริยา-คำนาม”) วัตถุประสงค์หลักคือทำให้งานการดูแลระบบเป็นแบบอัตโนมัติ แต่เป็นภาษาตีความเต็มรูปแบบที่มีโครงสร้างที่จำเป็นทั้งหมด: การข้ามแบบมีเงื่อนไข, ลูป, ตัวแปร, อาร์เรย์, อ็อบเจ็กต์, การจัดการข้อผิดพลาด ฯลฯ โปรแกรมแก้ไขข้อความใดๆ ก็ใช้ได้สำหรับการเขียนสคริปต์ แต่วิธีที่ดีที่สุดคือเรียกใช้ Windows PowerShell ISE
คุณสามารถส่งพารามิเตอร์ไปยังสคริปต์ ทำให้จำเป็น และตั้งค่าเริ่มต้นได้ นอกจากนี้ Windows PowerShell ยังช่วยให้คุณสร้างและเรียกใช้ฟังก์ชันในลักษณะเดียวกับ cmdlets โดยใช้โครงสร้างฟังก์ชันและเครื่องหมายปีกกา สคริปต์ที่มีฟังก์ชันเรียกว่าโมดูลและมีนามสกุล .psm1 โมดูลจะต้องจัดเก็บไว้ในไดเร็กทอรีที่กำหนดไว้ในตัวแปรสภาพแวดล้อม PowerShell คุณสามารถดูได้ด้วยคำสั่งต่อไปนี้:
Get-ChildItem Env:PSModulePath | Format-Table -AutoSize
สายพานลำเลียง
ในตัวอย่างสุดท้าย เราได้ใช้โครงสร้างที่ผู้ใช้เชลล์ Unix คุ้นเคย ใน Windows PowerShell แถบแนวตั้งยังช่วยให้คุณส่งเอาต์พุตของคำสั่งหนึ่งไปยังอินพุตของอีกคำสั่งหนึ่งได้ แต่มีความแตกต่างที่สำคัญในการใช้งานไปป์ไลน์: เราไม่ได้พูดถึงชุดอักขระหรือบางประเภทอีกต่อไป ข้อความ. cmdlet ในตัวหรือฟังก์ชันที่ผู้ใช้กำหนดจะส่งกลับวัตถุหรืออาร์เรย์ของวัตถุ และยังสามารถรับเป็นอินพุตได้อีกด้วย เช่นเดียวกับเชลล์เป้าหมายและผู้สืบทอดจำนวนมาก PowerShell ทำให้งานที่ซับซ้อนง่ายขึ้นด้วยไปป์ไลน์
ตัวอย่างไปป์ไลน์ที่ง่ายที่สุดมีลักษณะดังนี้:
Get-Service | Sort-Object -property Status
ขั้นแรก Get-Service cmdlet จะถูกดำเนินการ จากนั้นบริการทั้งหมดที่ได้รับจะถูกส่งไปยัง Sort-Object cmdlet เพื่อการเรียงลำดับตามคุณสมบัติสถานะ อาร์กิวเมนต์ใดที่ส่งผลลัพธ์ของส่วนก่อนหน้าของไปป์ไลน์จะขึ้นอยู่กับประเภทของไปป์ไลน์ - โดยปกติจะเป็น InputObject ปัญหานี้จะมีการกล่าวถึงในรายละเอียดเพิ่มเติมในบทความเกี่ยวกับภาษาการเขียนโปรแกรม PowerShell โดยเฉพาะ
หากคุณต้องการ คุณสามารถดำเนินการต่อสายโซ่และส่งผลลัพธ์ของการดำเนินการ Sort-Object ไปยัง cmdlet อื่นได้ (จะดำเนินการจากซ้ายไปขวา) อย่างไรก็ตาม ผู้ใช้ Windows ยังสามารถเข้าถึงโครงสร้างสำหรับการแบ่งหน้าที่คุ้นเคยกับ Unixoids ทั้งหมด:
Get-Service | Sort-Object -property Status | more
กำลังทำงานในเบื้องหลัง
บ่อยครั้งที่จำเป็นต้องรันคำสั่งบางอย่างในเบื้องหลังเพื่อไม่ให้รอผลลัพธ์ของการดำเนินการในเซสชันเชลล์ Windows PowerShell มีหลาย cmdlets สำหรับกรณีนี้:
Start-Job
- เปิดตัวงานพื้นหลัง
Stop-Job
— หยุดงานพื้นหลัง
Get-Job
— ดูรายการงานพื้นหลัง
Receive-Job
— การดูผลลัพธ์ของการดำเนินการงานเบื้องหลัง
Remove-Job
— การลบงานพื้นหลัง
Wait-Job
- ถ่ายโอนงานพื้นหลังกลับไปที่คอนโซล
ในการเริ่มต้นงานพื้นหลัง เราใช้ Start-Job cmdlet และระบุคำสั่งหรือชุดคำสั่งในวงเล็บปีกกา:
Start-Job {Get-Service}
งานเบื้องหลังใน Windows PowerShell สามารถจัดการได้โดยการรู้ชื่อ ขั้นแรก เรามาเรียนรู้วิธีแสดงข้อมูลเหล่านี้กัน:
Get-Job
ตอนนี้เรามาแสดงผลของงาน Job1 กัน:
Receive-Job Job1 | more
ทุกอย่างค่อนข้างเรียบง่าย
การดำเนินการคำสั่งระยะไกล
Windows PowerShell ช่วยให้คุณสามารถรันคำสั่งและสคริปต์ได้ไม่เพียงแต่ในเครื่องคอมพิวเตอร์เท่านั้น แต่ยังรวมถึงคอมพิวเตอร์ระยะไกลและแม้แต่ในเครื่องทั้งกลุ่ม มีหลายวิธีในการทำเช่นนี้:
- cmdlet จำนวนมากมีพารามิเตอร์
-ComputerName
แต่ด้วยวิธีนี้จะไม่ทำงานเช่นการสร้างสายพานลำเลียง - Cmdlet
Enter-PSSession
ช่วยให้คุณสร้างเซสชันแบบโต้ตอบบนเครื่องระยะไกล - การใช้ cmdlet
Invoke-Command
คุณสามารถเรียกใช้คำสั่งหรือสคริปต์บนคอมพิวเตอร์ระยะไกลตั้งแต่หนึ่งเครื่องขึ้นไป
เวอร์ชันของ PowerShell
PowerShell มีการเปลี่ยนแปลงไปมากนับตั้งแต่เปิดตัวครั้งแรกในปี 2006 เครื่องมือนี้พร้อมใช้งานสำหรับหลายระบบที่ทำงานบนแพลตฟอร์มฮาร์ดแวร์ที่แตกต่างกัน (x86, x86-64, Itanium, ARM): Windows XP, Windows Server 2003, Windows Vista, Windows Server 2008/2008 R2, Windows 7, Windows 8, Windows 8.1, Windows RT, Windows RT 8.1, Windows Server 2012/2012 R2, Windows 10, Windows Server 2016, GNU/Linux และ OS X รุ่นล่าสุด 6.2 เปิดตัวเมื่อวันที่ 10 มกราคม 2018 สคริปต์ที่เขียนสำหรับเวอร์ชันก่อนหน้านี้มีแนวโน้มที่จะทำงานในเวอร์ชันที่ใหม่กว่า แต่การแบ็คพอร์ตอาจเป็นปัญหาได้ เนื่องจาก PowerShell ได้แนะนำ cmdlets ใหม่จำนวนมากตลอดหลายปีที่ผ่านมาของการพัฒนา คุณสามารถดูเวอร์ชันของเชลล์คำสั่งที่ติดตั้งบนคอมพิวเตอร์ได้โดยใช้คุณสมบัติ PSVersion ของตัวแปรในตัว $PSVersionTable:
$PSVersionTable.PSVersion
คุณยังสามารถใช้ cmdlet:
Get-Variable -Name PSVersionTable –ValueOnly
เช่นเดียวกับ Get-Host cmdlet ในความเป็นจริงมีตัวเลือกมากมาย แต่หากต้องการใช้งานคุณต้องเรียนรู้ภาษาการเขียนโปรแกรม PowerShell ซึ่งเราจะทำใน
ผลของการ
Microsoft ได้สร้างเชลล์ที่ทรงพลังมากพร้อมสภาพแวดล้อมแบบรวมที่สะดวกสำหรับการพัฒนาสคริปต์ มันแตกต่างจากเครื่องมือที่เราคุ้นเคยในโลกของ Unix โดยการบูรณาการอย่างลึกซึ้งกับระบบปฏิบัติการตระกูล Windows รวมถึงซอฟต์แวร์สำหรับพวกเขาและแพลตฟอร์ม .NET Core PowerShell สามารถเรียกได้ว่าเป็นเชลล์เชิงวัตถุเนื่องจาก cmdlet และฟังก์ชันที่ผู้ใช้กำหนดส่งกลับวัตถุหรืออาร์เรย์ของวัตถุและสามารถใช้เป็นอินพุตได้ เราคิดว่าผู้ดูแลระบบเซิร์ฟเวอร์ทุกคนบน Windows ควรเป็นเจ้าของเครื่องมือนี้: เวลาผ่านไปแล้วเมื่อพวกเขาสามารถทำได้โดยไม่ต้องใช้บรรทัดคำสั่ง จำเป็นต้องมีเชลล์คอนโซลขั้นสูงเป็นพิเศษ
เฉพาะผู้ใช้ที่ลงทะเบียนเท่านั้นที่สามารถเข้าร่วมในการสำรวจได้
หัวข้อใดที่ควรกล่าวถึงเป็นอันดับแรกในบทความถัดไปของซีรีส์นี้?
-
ลด 53,2%การเขียนโปรแกรมใน PowerShell123
-
ลด 42,4%ฟังก์ชั่นและโมดูล PowerShell98
-
ลด 22,1%จะเซ็นสคริปต์ของคุณเองได้อย่างไร?51
-
ลด 12,1%การทำงานกับที่เก็บข้อมูลผ่านผู้ให้บริการ (ผู้ให้บริการ)28
-
ลด 57,6%การบริหารคอมพิวเตอร์อัตโนมัติด้วย PowerShell133
-
ลด 30,7%การจัดการซอฟต์แวร์และการฝังโปรแกรมปฏิบัติการ PowerShell ในผลิตภัณฑ์ของบริษัทอื่น71
ผู้ใช้ 231 คนโหวต ผู้ใช้ 37 รายงดออกเสียง
ที่มา: will.com