PowerShell พร้อมที่จะแทนที่ Cygwin shell ของฉันบน Windows หรือไม่ [ปิด]


384

ฉันกำลังถกเถียงกันว่าฉันควรเรียนรู้ PowerShell หรือแค่ติดกับCygwin / Perl สคริปต์ / Unix shell script ฯลฯ

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

การเขียนสคริปต์ Unix มีประสิทธิภาพมาก PowerShell เข้ามาใกล้พอที่จะรับประกันการสลับเปลี่ยนหรือไม่

นี่คือบางสิ่งที่เฉพาะเจาะจง (หรือรายการเทียบเท่า) ที่ฉันต้องการค้นหาใน PowerShell:

  • grep
  • ประเภท
  • UNIQ
  • Perl (PowerShell มาถึงขีดความสามารถของ Perl ได้ใกล้แค่ไหน)
  • AWK
  • sed
  • ไฟล์ (คำสั่งที่ให้ข้อมูลไฟล์)
  • เป็นต้น

7
ฉันจะไม่พูดว่าฉันสนใจที่จะรับ Powershell พบหน้านี้และตอนนี้ฉันรู้ถึงความแตกต่างทั่วไประหว่าง PS และสคริปต์เชลล์ที่ฉันคุ้นเคย
Bender the Greatest

5
โพสต์นี้ก็เพิ่มขึ้นจากเถ้าถ่านในการส่งลิงค์ HN การทำงานที่ดี. และไม่ดีสำหรับ @Bobby เนื่องจากการปิดนี้ไม่สร้างสรรค์
ซิด

26
หากใครบางคนไม่สามารถถามได้ว่าเครื่องมือตัวใดที่เลียนแบบฟังก์ชันของเครื่องมืออื่นได้ดีเพียงใดดังนั้นจึงไม่สามารถตอบคำถามเปรียบเทียบเครื่องมือได้ นี่เป็นถ้อยคำที่ใช้ความระมัดระวังเพื่อหลีกเลี่ยงการทะเลาะวิวาท แต่ก็ไม่ได้คิดว่าจะเป็นการ "โต้เถียง" เพียงเพราะดูเหมือนคำถาม Unix กับ Windows และมันก็มีคำตอบที่เป็นจริงและมีจุดประสงค์พร้อมด้วยข้อมูลเชิงลึกเพิ่มเติมเกี่ยวกับการเขียนสคริปต์ Unix ที่มีประโยชน์บน Windows
chernevik

16
ทำไมสิ่งนี้ถึงปิดอีกครั้ง มีคนโปรดแก้ไขชื่อเพื่อพูดว่า "PowerShell vs Unix Shells บนแพลตฟอร์ม Windows" เพื่อคัดท้าย trolls ให้ห่างจากการใช้เป็น "Windows vs Unix" ซึ่งไม่ใช่ นี่เป็นคำถามที่สร้างสรรค์อย่างสมบูรณ์แบบ - โหวตให้เปิดใหม่อีกครั้ง
x0n

3
op คือการผสมเปลือกด้วยเครื่องมือ PowerShell มีการใช้งาน แต่ GNU เป็นโครงการที่นำสารพัด UNIX ไปใช้กับ OS อื่นได้อย่างอิสระรวมถึง Windows ทุกสิ่งในรายการ op ให้มีการใช้ gnu ใน Windows สามารถเข้าถึงได้จาก GnuWin32 หรือแต่ละไซต์ Windows BAT ไม่ไร้ประโยชน์มีการเปลี่ยนเส้นทางและไปป์และเงื่อนไข
MeaCulpa

คำตอบ:


783

เครื่องมือเป็นเพียงเครื่องมือ
พวกเขาช่วยหรือไม่
คุณต้องการความช่วยเหลือหรือไม่

ถ้าคุณรู้ว่ายูนิกซ์และเครื่องมือเหล่านั้นทำสิ่งที่คุณต้องการให้ทำบน Windows - คุณเป็นคนที่มีความสุขและไม่จำเป็นต้องเรียนรู้ PowerShell (เว้นแต่คุณต้องการสำรวจ)

ความตั้งใจดั้งเดิมของฉันคือการรวมชุดเครื่องมือ Unix ใน Windows และทำได้ด้วย (เราหลายคนในทีมมีภูมิหลังของ Unix ที่ลึกและให้ความเคารพต่อชุมชนนั้นอย่างดี)

สิ่งที่ฉันพบคือสิ่งนี้ไม่ได้ช่วยอะไรมากมาย สาเหตุที่ AWK / grep / sed ไม่ทำงานกับCOM , WMI , ADSI , Registry, ที่เก็บใบรับรองและอื่น ๆ

กล่าวอีกนัยหนึ่ง UNIX เป็นระบบนิเวศที่ปรับแต่งเองรอบ ๆ ไฟล์ข้อความ ดังนั้นเครื่องมือประมวลผลข้อความจึงเป็นเครื่องมือการจัดการที่มีประสิทธิภาพ Windows เป็นระบบนิเวศที่แตกต่างกันโดยสิ้นเชิงปรับตัวเองรอบ API และวัตถุ นั่นเป็นเหตุผลที่เราคิดค้น PowerShell

สิ่งที่ฉันคิดว่าคุณจะพบคือมีหลายครั้งที่การประมวลผลข้อความจะไม่ได้รับสิ่งที่คุณต้องการบน Windows ณ จุดนี้คุณจะต้องการรับ PowerShell หมายเหตุ - มันไม่ได้เป็นข้อตกลงทั้งหมดหรือไม่มีอะไร ภายใน PowerShell คุณสามารถโทรออกไปยังเครื่องมือ Unix ของคุณ (และใช้กระบวนการข้อความหรือการประมวลผลข้อความของ PowerShell) นอกจากนี้คุณสามารถโทร PowerShell จากเครื่องมือ Unix ของคุณและรับข้อความ

อีกครั้ง - ไม่มีศาสนาที่นี่ - เรามุ่งเน้นที่จะมอบเครื่องมือที่คุณต้องการเพื่อความสำเร็จ นั่นคือเหตุผลที่เราหลงใหลเกี่ยวกับข้อเสนอแนะ แจ้งให้เราทราบว่าเรากำลังตกหลุมงานหรือที่ที่คุณไม่มีเครื่องมือที่คุณต้องการและเราจะใส่ไว้ในรายการและไปที่นั้น

ในความซื่อสัตย์ทั้งหมดเรากำลังขุดตัวเองออกจากหลุม 30 ปีดังนั้นมันจะใช้เวลาสักครู่ ที่กล่าวว่าหากคุณรับเบต้าของWindows Server 2008 / R2 และ / หรือเบต้าของผลิตภัณฑ์เซิร์ฟเวอร์ของเราฉันคิดว่าคุณจะตกใจเมื่อเห็นว่ารูเต็มแล้ว

เกี่ยวกับการใช้งาน - เรามีการดาวน์โหลดถึง 3.5 ล้านครั้งแล้ว ไม่รวมบุคคลที่ใช้งานใน Windows Server 2008 เนื่องจากมีการรวมไว้เป็นองค์ประกอบเสริมและไม่จำเป็นต้องดาวน์โหลด

V2 จะจัดส่งใน Windows ทุกรุ่น มันจะเป็นค่าเริ่มต้นสำหรับทุกรุ่นยกเว้นแกนเซิร์ฟเวอร์ที่เป็นส่วนประกอบเสริม ไม่นานหลังจาก Windows 7 / Windows Server 2008 R2 จัดส่งเราจะทำให้ V2 พร้อมใช้งานบนแพลตฟอร์มทั้งหมด Windows XP และสูงกว่า กล่าวอีกนัยหนึ่ง - การลงทุนในการเรียนรู้ของคุณจะสามารถใช้ได้กับเครื่องจักร / สภาพแวดล้อมจำนวนมาก

หนึ่งความคิดเห็นล่าสุด ถ้า / เมื่อคุณเริ่มเรียนรู้ PowerShell ฉันคิดว่าคุณจะมีความสุขมาก การออกแบบส่วนใหญ่ได้รับอิทธิพลอย่างมากจากภูมิหลังของ Unix ของเราดังนั้นในขณะที่เราแตกต่างกันมากคุณจะหยิบมันขึ้นมาอย่างรวดเร็ว

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

ทดลอง! สนุก! มีส่วนร่วม!


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

55
@ Jeffrey: มีโอกาสสำหรับ terminal ที่ดีกว่าสำหรับ Windows หรือไม่ Powershell เป็นภาษาสคริปต์ที่มีประสิทธิภาพ แต่ความจริงมันจะทำงานใน cmd.exe ทำให้สะดวกมากขึ้นในโหมดโต้ตอบ
sumek

47
คำถาม "ไม่สร้างสรรค์" นี้สร้างความเข้าใจที่ดีที่สุดที่ฉันเคยเห็น "ใน Unix ทุกอย่างเป็นไฟล์" มนต์และทำไม Windows จึงแตกต่างกัน StackOverflow อาจจะดีกว่าการปิดไม่ใช่การอภิปรายที่สร้างสรรค์?
chernevik

12
@sumek - ลองทำ ConEmu; ฉันใช้มันมาหลายสัปดาห์แล้วและมันก็ค่อนข้างหวาน: hanselman.com/blog/…
EZ Hart

4
หัวขึ้น: PowerShell ไม่ชอบการไพพ์ข้อมูลไบนารี ดังนั้นระวังเมื่อคุณเรียกใช้เครื่องมือ Unix ที่ไว้ใจได้ของคุณอย่าทำสิ่งต่าง ๆ เช่นPowerShell tar -c . | gzip > package.tar.gz โดยตรงหรือคุณจะประสบ ดูbrianreiter.org/2010/01/29/…
Interarticle

123

grep

Select-Stringcmdlet และ-matchโอเปอเรเตอร์ทำงานกับ regexes นอกจากนี้คุณยังสามารถใช้ประโยชน์จากการสนับสนุน regex ของ. NET เพื่อการใช้งานขั้นสูงเพิ่มเติมได้โดยตรง

ประเภท

Sort-Objectมีประสิทธิภาพมากขึ้น (มากกว่าที่ฉันจำได้ * ระวัง! sort) อนุญาตให้เรียงลำดับหลายระดับในการแสดงออกโดยพลการ ที่นี่การบำรุงรักษาประเภทพื้นฐานของ PowerShell ช่วย; เช่นDateTimeคุณสมบัติจะถูกจัดเรียงเป็นแบบDateTimeโดยไม่ต้องตรวจสอบให้แน่ใจว่าการจัดรูปแบบเป็นรูปแบบที่สามารถจัดเรียงได้

UNIQ

Select-Object -Unique

Perl (PowerShell มีความสามารถใน Perl มากแค่ไหน)

ในแง่ของความกว้างของห้องสมุดการสนับสนุนเฉพาะโดเมนของ Perl: ยังไม่ปิด (ยัง)

สำหรับการเขียนโปรแกรมทั่วไป PowerShell จะเหนียวแน่นและสอดคล้องกันมากกว่าและสามารถขยายได้ง่ายขึ้น ช่องว่างหนึ่งสำหรับการเลื่อนข้อความเป็นสิ่งที่เทียบเท่ากับ..ตัวดำเนินการของ Perl

AWK

มันนานพอแล้วตั้งแต่ใช้ AWK (ต้องมากกว่า 18 ปี, หลังจากนั้นฉันเพิ่งใช้ Perl) ดังนั้นจึงไม่สามารถออกความเห็นได้จริงๆ

sed

[ดูด้านบน]

ไฟล์ (คำสั่งที่ให้ข้อมูลไฟล์)

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

คุณสามารถจัดการรีจิสตรี, ที่เก็บใบรับรอง, SQL Server, แคช RSS ของ Internet Explorer เป็นต้นเป็นพื้นที่วัตถุที่สามารถเข้าถึงได้โดย cmdlets เดียวกันกับระบบไฟล์


PowerShell เป็นหนทางไปข้างหน้าบน Windows อย่างแน่นอน Microsoft ได้ทำให้เป็นส่วนหนึ่งของข้อกำหนดสำหรับผลิตภัณฑ์ที่ไม่ใช่บ้านในอนาคต การสนับสนุนที่หลากหลายใน Exchange สนับสนุนใน SQL Server นี่เป็นเพียงการขยาย

ตัวอย่างล่าสุดคือ TFS PowerToys การดำเนินการไคลเอ็นต์ TFS จำนวนมากดำเนินการโดยไม่ต้องเริ่มต้น tf.exe ในแต่ละครั้ง (ซึ่งต้องใช้การเชื่อมต่อเซิร์ฟเวอร์ TFS ใหม่เป็นต้น) และง่ายกว่าที่จะประมวลผลข้อมูลเพิ่มเติม รวมถึงการอนุญาตให้เข้าถึง API ของไคลเอ็นต์ TFS ทั้งหมดได้อย่างละเอียดกว่าที่เปิดเผยใน Team Explorer ของ TF.exe


2
สิ่งที่เป็นที่รุ่นของผู้ให้บริการที่น่าสนใจเพียงเพราะระบบปฏิบัติการไม่ได้ใช้ข้อความเป็นสื่อกลางการตั้งค่าสากลดังนั้นคุณต้องให้บริการเหล่านี้ ด้วย UNIX ภาษาส่วนใหญ่จะมี API เพื่อสัมผัส PAM โฮสต์และแพ็คเกจ แต่ท้ายที่สุดข้อความจะอยู่ที่นั่นเสมอ
Daishiman

12
ข้อความไม่ได้เป็นรูปแบบที่ดีที่สุดสำหรับทุกสิ่งเสมอไป (เริ่มต้นด้วยฐานข้อมูลและภาพแรสเตอร์) แต่ฉันคิดว่าเราสามารถเห็นด้วยที่จะไม่เห็นด้วยมากกว่าสงครามรูปแบบเปิด
Richard Richard

5
Powershell สามารถใช้วัตถุใด ๆ ใน. NET Framework ไม่ตรงกับความสามารถของโดเมนของ Perl หรือไม่ รวมทั้งคุณสามารถเขียน cmdlet ใน C # ฯลฯ หากคุณต้องการการใช้งานใหม่
Chris S

เปรียบเทียบแบบจุดต่อจุด ทำได้ดีนี่. นี่ควรเป็นคำตอบที่ยอมรับได้ จุดแข็งของ PowerShell อยู่ในรากฐานของ. NET และความง่ายดายในการขยายระบบโดยการเขียน Cmdlets ใหม่หรือแม้แต่เรียกคลาสไลบรารี
Sau001

การใช้งานทั่วไปของ sed (ฉันคิดว่า) น่าจะ: sed 's/pattern/replacement/' fileซึ่งคร่าวๆgc file | %{$_ -replace 'pattern','replacement'}และคล้ายกันสำหรับ awk: awk 'BEGIN {} /pat1/ {action1} /pat2/ {action2} END {}' fileคร่าวๆ{BEGIN {}; switch -r -c -file file { 'pat1' {action1} 'pat2' {action2}}; END{};}
Nathan Chappell

56

ในฐานะคนที่มีอาชีพมุ่งเน้นไปที่การพัฒนาองค์กร Windows ตั้งแต่ปี 1997 - 2010 คำตอบที่ชัดเจนคือ PowerShell ด้วยเหตุผลที่ดีทั้งหมดที่ให้ไว้ก่อนหน้านี้ (เช่นเป็นส่วนหนึ่งของกลยุทธ์องค์กรของ Microsoft มันทำงานร่วมกับ Windows / COM / .NET ได้ดี การใช้ออบเจ็กต์แทนไฟล์จะมีรูปแบบการเข้ารหัส "ยิ่งขึ้น" ด้วยเหตุนี้ฉันจึงใช้และส่งเสริม PowerShell ในช่วงสองปีที่ผ่านมาด้วยความเชื่อที่ชัดเจนว่าฉันกำลังติดตาม "Word of Bill"

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

ที่จริงแล้วเมื่อฉันพบว่างานของฉันเพิ่มมากขึ้นในสภาพแวดล้อมที่แตกต่างกันฉันพบว่ามันมีประโยชน์มากขึ้นในการใช้สคริปต์ Bash ในขณะนี้เนื่องจากพวกเขาไม่เพียงทำงานบน Linux, Solaris และ Mac OS X แต่พวกเขายังทำงานด้วย ความช่วยเหลือของ Cygwin บน Windows

ดังนั้นหากคุณซื้อด้วยความเชื่อมั่นว่าอนาคตของระบบปฏิบัติการนั้นเป็นสินค้ามากกว่าการผูกขาดมันก็ดูเหมือนจะสมเหตุสมผลที่จะเลือกกลยุทธ์เครื่องมือการพัฒนาแบบว่องไวที่หลีกเลี่ยงเครื่องมือที่เป็นกรรมสิทธิ์ซึ่งเป็นไปได้ อย่างไรก็ตามหากคุณเห็นว่าอนาคตของคุณถูกครอบงำโดย all-that-is-Redmond ให้ไปที่ PowerShell


1
สคริปต์ unix ทำงานอย่างสมบูรณ์แบบบน Cygwin-Windows โดยไม่มีข้อผิดพลาดหรือไม่?
Pacerier

@Pacerier ฉันใช้ Cygwin และ MinGW มา 12 ปีแล้วและมีปัญหาอย่างน่าประหลาดใจน้อยมาก สิ่งสำคัญคือถ้าบางสิ่งบางอย่างไม่ทำงานอาจเป็นไปได้ที่จะถอยกลับไปใช้เครื่องมือ Windows หรืออะไรก็ได้ - กระบวนการสามารถเริ่มต้นได้ในลักษณะเดียวกับเชลล์อื่น ๆ ที่เริ่มต้น
Evgeni Sergeev

4
เอาล่ะคำตอบของคุณมาจาก 2011 วันนี้ PowerShell ทำงานบน linux ด้วย และ - ความคิดเห็นส่วนตัวของฉัน - ทุบตีโบราณเกินไป ไวยากรณ์แย่มากและฉันอยากจะใช้ภาษาสคริปต์ที่แตกต่างออกไป ทุกวันนี้เมื่อหลามเป็นมาตรฐานใน linux distros ส่วนใหญ่ฉันไม่เห็นเหตุผลที่จะใช้ bash สำหรับสคริปต์ ฉันขอแนะนำให้คุณตรวจสอบ PowerShell อีกครั้งเนื่องจากมีสิ่งต่าง ๆ เกิดขึ้นมากมายตั้งแต่ปี 2011
itmuckel


33

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

Cygwin ยังคงสภาพแวดล้อมการเขียนสคริปต์ที่ฉันเลือกสำหรับโฮสต์ Windows แน่นอนว่ามันเป็นทางเลือกในการทำสิ่งต่าง ๆ ให้สำเร็จ


27
การใช้วัตถุเป็นกระบวนทัศน์ที่เปลี่ยนไปและทำให้บางคนคุ้นเคย แต่หลีกเลี่ยงการวิเคราะห์คำซ้ำทั้งหมดในแต่ละขั้นตอนที่เกี่ยวข้องกับข้อมูลที่มีโครงสร้าง (เช่นไม่จำเป็นต้องให้เขตข้อมูลคั่นด้วย)
Richard

16
@Andy White @Daishiman ฉันสามารถเข้าใจได้ว่ามีเส้นโค้งการเรียนรู้ด้วย PowerShell แต่การวางวัตถุในท่ออาจมีความยืดหยุ่นมากกว่าการวางข้อความ @Richard ถูกต้อง :)
Steven Murawski

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

12
@daishiman - ประโยชน์ของออบเจกต์คือเมื่อคุณต้องการคุณสมบัติคุณจะต้องถาม - คุณไม่จำเป็นต้องแยกวิเคราะห์เดาหล่อ ฉันไม่เข้าใจประเด็นของคุณเกี่ยวกับ "สิ่งที่เกิดขึ้นเมื่อวัตถุไม่มีวิธีการใช้งานร่วมกันได้" - คุณสามารถพูดอีกวิธีหนึ่งหรือยกตัวอย่างปัญหาได้หรือไม่? ขอบคุณ
Jeffrey Snover - MSFT

13
@ Daishiman - ฉันเข้าใจ ในทางปฏิบัติผู้คนพบว่าสิ่งนี้ไม่ใช่ปัญหา แต่เป็นข้อได้เปรียบอย่างมาก ที่กล่าวว่าฉันจะเห็นว่าถ้าคุณเป็นผู้เชี่ยวชาญในการแยกวิเคราะห์ข้อความนี้จะเป็นทักษะใหม่ในการเรียนรู้และอาจรู้สึกไม่จำเป็นและอึดอัดในตอนแรก อีกครั้ง - สิ่งที่ช่วยเป็นเครื่องมือที่เหมาะสม
Jeffrey Snover - MSFT

15

มีคำตอบที่ยอดเยี่ยมมากมายที่นี่และนี่คือคำตอบของฉัน PowerShell พร้อมถ้าคุณเป็น ... ตัวอย่าง:

grep = " Select-String -Pattern "

sort = "Sort-Object"

uniq = " Get-Unique "

file = " รับรายการ "

cat = " รับเนื้อหา "

Perl / AWK / Sed ไม่ใช่คำสั่ง แต่เป็นอรรถประโยชน์ที่ยากต่อการเปรียบเทียบ แต่คุณสามารถทำเกือบทุกอย่างใน PowerShell


2
คุณเชื่อไหมว่าคำสั่งสี่ตัวอักษรที่คลุมเครือบรรพบุรุษของเราถูกบังคับให้ใช้?
Evgeni Sergeev

4
@EvgeniSergeev ทั้งหมดข้างต้นมีอยู่โดยการเริ่มต้นเป็นsls, sort, gu, gi, gcตามลำดับ ชื่อแบบยาวที่อ่านได้ซึ่งชื่อแท็บเสร็จสมบูรณ์และชื่อชนิดที่พิมพ์ได้สั้นในระบบเดียว นั่นเป็นความคืบหน้าที่ใช้งานง่ายสำหรับคุณ
TessellatingHeckler

หนึ่งในนามแฝงสำหรับGet-Contentเป็นcatดังนั้นสำหรับที่หนึ่งไม่มีความแตกต่างระหว่าง Cygwin / Unix และ PowerShell ใด ๆ น่าเสียดายที่เอกสารส่วนใหญ่ของ Microsoft สำหรับ cmdlet ขาดข้อมูลเกี่ยวกับนามแฝง แต่รายการนามแฝงทั้งหมดจะถูกส่งออกโดยใช้Get-Aliasในเซสชัน PowerShell นามแฝงของ "Get-Unique" คือ "gu" ดังนั้นจึงสั้นกว่า Cygwin / Unix!
Peter Mortensen

13

ฉันเพิ่งเริ่มเล่นน้ำใน PowerShell ด้วยความรุนแรงในระดับใด แม้ว่าในช่วงเจ็ดปีที่ผ่านมาฉันทำงานในสภาพแวดล้อมที่ใช้ Windows เป็นพิเศษ แต่ฉันมาจากพื้นหลังของ Unix และพบว่าตัวเองพยายาม "Unix-fy" ประสบการณ์การโต้ตอบของฉันบน Windows อยู่ตลอดเวลา มันน่าผิดหวังที่จะพูดน้อย

มันยุติธรรมเท่านั้นที่จะเปรียบเทียบ PowerShell กับBash , tcshหรือzshเนื่องจากยูทิลิตี้เช่นgrep , sed , awk , find , ฯลฯ ไม่ได้พูดอย่างเคร่งครัดเป็นส่วนหนึ่งของเชลล์ อย่างไรก็ตามมันจะเป็นส่วนหนึ่งของสภาพแวดล้อม Unix ที่กล่าวว่าคำสั่ง PowerShell เช่นSelect-Stringมีฟังก์ชั่นคล้ายกับgrepและถูกรวมเป็นโมดูลหลักใน PowerShell ... ดังนั้นเส้นจึงอาจเบลอเล็กน้อย

ฉันคิดว่าสิ่งสำคัญคือวัฒนธรรมและความจริงที่ว่าชุดเครื่องมือนั้นจะรวบรวมวัฒนธรรมที่เกี่ยวข้อง:

  • Unix เป็นไฟล์ที่ใช้ (โดยทั่วไปที่ไม่ใช่ Unicode) ข้อความตามวัฒนธรรม ไฟล์การกำหนดค่าเป็นไฟล์ข้อความเกือบเฉพาะ ในทางกลับกัน Windows นั้นมีโครงสร้างที่มากขึ้นในแง่ของรูปแบบการกำหนดค่าโดยทั่วไปการกำหนดค่าจะถูกเก็บไว้ในฐานข้อมูลที่เป็นกรรมสิทธิ์ (เช่นรีจิสทรีของ Windows) ซึ่งต้องการเครื่องมือพิเศษสำหรับการจัดการของพวกเขา
  • ส่วนติดต่อผู้ดูแลระบบ Unix (และหลาย ๆ ปีที่ผ่านมาการพัฒนา) นั้นเป็นบรรทัดคำสั่งและเทอร์มินัลเสมือนจริง Windows เริ่มต้นใช้งานในรูปแบบ GUI และฟังก์ชั่นการจัดการเพิ่งจะเริ่มเคลื่อนตัวออกจากการใช้ GUI เป็นพิเศษ เราสามารถคาดหวังว่าประสบการณ์ Unix ในบรรทัดคำสั่งจะสมบูรณ์ยิ่งขึ้นและเป็นผู้ใหญ่มากขึ้นเนื่องจากผู้นำที่สำคัญที่มีใน PowerShell และประสบการณ์ของฉันตรงกับสิ่งนี้ จากนี้ในประสบการณ์ของฉัน:

    • ประสบการณ์การบริหาร Unix มุ่งเน้นการทำให้สิ่งต่าง ๆ ง่ายขึ้นในการกดปุ่มน้อยที่สุด นี่อาจเป็นผลมาจากสถานการณ์ในอดีตของการจัดการเซิร์ฟเวอร์ผ่านการเชื่อมต่อผ่านสายโทรศัพท์ 9600 baud ที่ช้า ตอนนี้ PowerShell มีนามแฝงซึ่งใช้เวลานานกว่าจะได้มาตรฐานVerb-Noun ที่ค่อนข้างละเอียดแต่การรู้จักนามแฝงเหล่านั้นเป็นความเจ็บปวดเล็กน้อย (ใคร ๆ ก็รู้ดีกว่า: alias | where {$_.ResolvedCommandName -eq "<command>"}?)

      ตัวอย่างของวิธีการรวยที่สามารถจัดการประวัติศาสตร์:

      iptablesคำสั่งมักจะยืดยาวและทำซ้ำด้วยความแตกต่างเล็กน้อยจะเป็นความเจ็บปวดถ้ามันไม่ได้เป็นเพียงหนึ่งในคุณสมบัติที่ประณีตของการจัดการประวัติที่สร้างขึ้นในBashดังนั้นการแทรกกฎ iptables ดังนี้:

      iptables -I camera-1-internet -s 192.168.0.50 -m state --state NEW -j ACCEPT

      ครั้งที่สองสำหรับกล้องตัวอื่น (" camera-2") เป็นเพียงกรณีของการออก:

      !!:s/-1-/-2-/:s/50/51

      ซึ่งหมายถึง "การดำเนินการคำสั่งก่อนหน้านี้ แต่แทน-1-ด้วย-2-และมี5051

    • ประสบการณ์ Unix ได้รับการปรับให้เหมาะสมสำหรับผู้พิมพ์ดีดระบบสัมผัส เราสามารถทำทุกอย่างได้โดยไม่ต้องออกจากตำแหน่ง "บ้าน" ตัวอย่างเช่นในBash การใช้การผูกคีย์Emacs (ใช่ Bash ยังสนับสนุนการเชื่อมvi ) การขี่จักรยานผ่านประวัติจะกระทำโดยใช้Ctrl-PและCtrl-Nในขณะที่ย้ายไปที่จุดเริ่มต้นและจุดสิ้นสุดของบรรทัดจะใช้Ctrl-AและCtrl-Eตามลำดับ ... และแน่นอน ไม่ได้จบแค่นั้น ลองการนำทางที่ง่ายที่สุดในคอนโซล PowerShell โดยไม่ย้ายจากตำแหน่งบ้านและคุณกำลังมีปัญหา

    • สิ่งที่เรียบง่ายเช่นเพจจิ้งเอนกประสงค์ (a la less ) บน Unix ดูเหมือนจะไม่สามารถใช้งานได้ทันทีใน PowerShell ซึ่งค่อนข้างน่าผิดหวังและประสบการณ์บรรณาธิการที่ยอดเยี่ยมก็ไม่มีอยู่เช่นกัน แน่นอนหนึ่งสามารถดาวน์โหลดเครื่องมือของบุคคลที่สามที่จะเติมเต็มช่องว่างเหล่านั้นได้ แต่แน่นอนว่ามันจะดีถ้าสิ่งเหล่านี้เป็นเพียง "มี" เหมือนพวกมันอยู่ในรสชาติของ Unix
  • วัฒนธรรม Windows อย่างน้อยก็ในแง่ของ API ของระบบส่วนใหญ่ขับเคลื่อนด้วยกรอบการสนับสนุน ได้แก่ . COMและ. NETซึ่งทั้งสองอย่างนี้มีโครงสร้างที่สูงและใช้วัตถุเป็นหลัก ในทางกลับกันการเข้าถึง Unix API นั้นโดยทั่วไปแล้วจะเป็นการเรียกใช้ C-style library ( /devและ/proc) หรือ (ไม่ใช่เชิงวัตถุ) การเรียกไลบรารี่ C ไม่แปลกใจเลยที่ประสบการณ์การเขียนสคริปต์จะตรงกับกระบวนทัศน์ระบบปฏิบัติการของตน PowerShell มีโครงสร้างตามธรรมชาติ (ทุกอย่างเป็นวัตถุ) และไฟล์Bash -and-friends API แบบมีโครงสร้างซึ่งอยู่ที่การกำจัดของโปรแกรมเมอร์ PowerShell นั้นกว้างใหญ่ (โดยหลัก ๆ จะจับคู่ความกว้างใหญ่ของชุดอินเตอร์เฟสCOMและ. NET มาตรฐานที่มีอยู่เดิม)

กล่าวโดยย่อแม้ว่าความสามารถในการเขียนสคริปต์ของ PowerShell นั้นมีประสิทธิภาพมากกว่าBash (โดยเฉพาะเมื่อคุณพิจารณาความพร้อมใช้งานของ. NET BCL ) แต่ประสบการณ์การโต้ตอบนั้นอ่อนแอลงอย่างมากโดยเฉพาะอย่างยิ่งถ้าคุณมาจากแป้นพิมพ์ทั้งหมด มุมมองที่อิงกับคอนโซล (Unix-heads หลายตัว)


คุณถาม "ใครก็ตามที่รู้สิ่งที่ดีกว่า: alias | โดยที่ {$ _. ResolvedCommandName -eq" <command> "}?" วิธีการเกี่ยวกับเพียงแค่alias -Definition *property(หรือรูปแบบอื่น ๆ )? ฉันคิดว่าปัญหาที่เกิดขึ้นกับคำตอบของคุณคือคุณกำลังวางเปลือกและคอนโซล: จำไว้ว่าคุณมีทางเลือกของคอนโซลที่มีตัวเลือกการแก้ไขที่แตกต่างกัน พวกเขาจงใจออกจากการแก้ไขคอนโซล DOS เสียเพื่อกระตุ้นให้ผู้คนใช้คอนโซลอื่นเช่น ISE
Duncan

BTW !!ตัวอย่างของคุณสามารถเขียนเป็น Powershell ได้(h -c 1) -replace '-1-','-2-' -replace '50','51' | iexแต่ง่ายกว่าสำหรับลูกศรขึ้นและแก้ไขสำหรับคำสั่งเดียว หากคุณต้องการทำตามคำสั่งมากมายฉันคิดว่า Powershell จะเป็นผู้ชนะ หากต้องการทำซ้ำ 10 คำสั่งที่ลงท้ายด้วยคำสั่ง # 255 ด้วยการแก้ไขของคุณ: (h -c 10 -id 255) -replace '-1-','-2-' -replace '50','51' | iexประวัติของ Powershell ยังช่วยให้คุณทำสิ่งที่ไม่เคยได้ยินมาในเปลือกหอย Linux ถ้าคุณสงสัยย้อนหลังยาวเพียงวิธีการสั่งเข้ามาเพื่อใช้งาน:h -id 20 | select { $_.EndExecutionTime - $_.StartExecutionTime }
ดันแคน

@Duncan ในแง่ของความคิดเห็นของคุณอีกครั้งเชลล์และคอนโซล - ฉันคิดว่านั่นเป็นเพียงความแตกต่างพื้นฐานระหว่าง Bash และ PS; นั่นคือ: ทุบตีคาดว่าจะมอบประสบการณ์การโต้ตอบบางอย่างในขณะที่ PS "ออก" เพื่อสิ่งอื่น ฉันไม่ได้มีประสบการณ์มากมายกับคอนโซล ISE แต่จากที่ฉันสามารถจำได้ว่ามันไม่ได้มีประสบการณ์การโต้ตอบอย่างมากมาย
Eric Smith

@ ดันแคนใช่ - จุดดีเกี่ยวกับความสามารถของ PS ในการส่งมอบในแง่ของเทคนิคประวัติศาสตร์ที่ชาญฉลาด
Eric Smith

@Duncan ... แต่แม้จะมีการยืนยันของคุณที่บางสิ่งบางอย่างไม่เคยได้ยินจากในเปลือกหอยลินุกซ์:fc -e "sed -i -e 's/-1-/-2-/g' -e 's/50/51/g'" 10 255
เอริคสมิ ธ

8

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

และถ้าคุณต้องการบางสิ่งบางอย่างเช่นsedมีUnixUtilsหรือGnuWin32ซึ่งคุณสามารถรวมเข้ากับ PowerShell ได้อย่างง่ายดาย

ในฐานะผู้ใช้ Unix ที่ยาวนานฉันมีปัญหาเล็กน้อยในการคุ้นเคยกับการตั้งชื่อชุดคำสั่ง

โดยพื้นฐานแล้วฉันว่ามันคุ้มค่าที่จะเรียนรู้ถ้า Windows เพียงอย่างเดียวของมันไม่มีปัญหา


1
มีโครงการโอเพนซอร์ส "Pash" ที่ให้คุณเรียกใช้ PowerShell บนแพลตฟอร์มอื่นผ่านทางโมโน tinyurl.com/6dyoso
John D. Cook

โว้ว! ขอบคุณสำหรับทิป; ฉันไม่สามารถรอที่จะให้มันลอง
yalestar

6

ถ้าคุณชอบเชลล์สคริปต์คุณจะรัก PowerShell!

เริ่มที่ไกด์นำเที่ยวของ Microsoft Command Shell (Ars Technica)


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

8
@Zan Lynx - คุณถูกต้องเกี่ยวกับการไม่พบสิ่งใด คำสั่งทั้งหมดมีนามแฝงและหลายคำสั่งจับคู่ทั้งคำสั่ง DOS และ UNIX (ps, dir, rm, ls, kill, ประวัติ, man, cat, clear ฯลฯ ) ชื่อมีความยาวเพื่อให้พวกเขามีชื่อที่มีความหมาย ดีเยี่ยมสำหรับสคริปต์ - ช่วยได้เมื่อบุคคลใหม่ต้องใช้และดูแลรักษา มีการขยายแท็บสำหรับ cmdlets, ฟังก์ชั่น, ตัวแปร, เส้นทาง, พารามิเตอร์อื่น ๆ ส่วนใหญ่ของไวยากรณ์มาจาก Unix shells และคุณกำลังพูดถึงเรื่องไวยากรณ์หลบหนีอะไร? `` ไม่ได้ใช้สำหรับการหลบหนีเนื่องจากเป็นตัวแยกพา ธ ใน Windows
manojlds

3
@Zan Lynx - ข้อโต้แย้งของคุณไม่ถูกต้อง หากต้องการหยุดการตีความตัวแปรให้ใช้'(อัญประกาศเดี่ยว) กับคู่สิ่งที่ราคาคู่ - write-output 'this is a "test"'เดียวกันการใช้งาน คำถามที่คุณชี้ไปสำหรับ Regex และการหลบหนีสำหรับ regex นั้นใช้ได้ทุกที่ Powershell มีสตริง Here-Strings / verbatim เช่นกัน แม้แต่ Java ก็ไม่มีสิ่งเหล่านี้! ลองหลบหนี regex ใน Java และบางครั้งคุณก็ไม่ใช้ตัวอักษร คุณใช้เมื่อคุณต้องการ LiteralPath ปฏิบัติต่ออักขระตัวแทนทั้งหมดและไม่ขยายออกไป คุณใช้มันเมื่อไฟล์ของคุณมี มันทำให้คุณมีทางเลือกมากขึ้น
manojlds

3
@manojlds: เปรียบเทียบกับ bash shell, Powershell เต็มไปด้วยความไม่สอดคล้องซึ่งไม่สมเหตุสมผลและทำให้สับสน ในทุบตีคุณใช้ตัวละครที่เหมือนกันทุกที่และพา ธ ของไฟล์จะถูกยกเว้นเช่นเดียวกับสตริง คุณไม่ต้องการพารามิเตอร์พิเศษสำหรับมัน หากคุณขยายตัวแปรที่มีอักขระพิเศษอยู่คุณใส่ไว้ในเครื่องหมายคำพูดคู่และเนื้อหานั้นปลอดภัยไม่จำเป็นต้องเรียกใช้ฟังก์ชันเพื่อหลบหนีอีกครั้ง
Zan Lynx

5
@Zan Lynx - ไม่มีความขัดแย้ง แม้แต่write-output "this is a `"test`""ผลงาน เพียงใช้`แทน `\ ' regex :: escape มีอยู่เพื่อช่วยคุณไม่ให้คุณพลาดสิ่งที่หลีกเลี่ยง ไม่จำเป็นต้องใช้ คุณกำลังคิดว่ามีตัวเลือกเพิ่มเติมที่จะช่วยคุณและป้องกันความผิดพลาดที่ไม่สอดคล้องกัน
manojlds

6

เมื่อการทดลองล่าสุดของฉันนำฉันไปสู่ความลึกของการโทร PowerShell และ. NET ฉันต้องบอกว่า PowerShell สามารถทำได้แทนที่ Cygwin และ Unix shell ได้

ฉันไม่แน่ใจเกี่ยวกับ Perl แต่เนื่องจากทั้ง PowerShell และ Perl เป็นทัวริงที่สมบูรณ์เป็นภาษาการเขียนโปรแกรมฉันให้สิ่งนี้ว่าใช่เพื่อแทนที่ Perl ด้วย

สิ่งหนึ่งที่ PowerShell มีเหนือ Cygwin และ Bash สามัญภายใต้ * nix คือความสามารถในการทำการโทร DLL แบบ sandboxed จัดการระบบปฏิบัติการผ่านการเรียก API โดยตรงวิธีการ WMI และแม้แต่วัตถุ COM วิธีการเกี่ยวกับการเปิดตัว Internet Explorer ด้วยรหัสจากนั้นทำสิ่งที่คุณต้องการด้วยเอกสารที่แสดงของพวกเขาเลียนแบบ back-end อย่างมีประสิทธิภาพสำหรับเว็บเซิร์ฟเวอร์

วิธีการเกี่ยวกับการรวบรวมข้อมูลจากเซิร์ฟเวอร์ SQL และผู้ให้บริการข้อมูลอื่น ๆ แยกวิเคราะห์และส่งออกเป็น CSV ข้อความอีเมลข้อความและรูปแบบไฟล์ใด ๆ (ด้วยทักษะที่เหมาะสมในการสร้างไฟล์ที่ถูกต้องจากข้อมูลที่ได้รับแน่นอน แต่ CSV พร้อมใช้งาน)

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

เกี่ยวกับคำสั่งใดที่นำไปปฏิบัติ - คำตอบโดย Richard แสดงรายการเหล่านั้นและความสามารถของ PowerShell ในการจำลองการทำงานของพวกเขาแล้ว

เกี่ยวกับว่า PowerShell แข็งแกร่งที่จะรับประกันการสลับเปลี่ยนหรือไม่ - นี่เป็นเรื่องของการตั้งค่าส่วนตัวแม้ว่าจะมีบริการ Windows เพิ่มขึ้นเรื่อย ๆ ที่ให้ PowerShell cmdlet เพื่อควบคุมพวกเขาไม่ใช่การใช้ PowerShell กับบริการเหล่านี้ถือเป็นอุปสรรค (เซิร์ฟเวอร์ Hyper-V เป็นบริการหลักดังกล่าวและยังให้ความสามารถในการทำงานกับ PowerShell cmdlets ได้ดีกว่า GUI!)

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


6

เมื่อคุณเปรียบเทียบ PowerShell กับชุดค่าผสม Cygwin / Perl / Shell โปรดทราบว่า PowerShell แสดงเฉพาะส่วน "Shell" ของชุดค่าผสมนั้น

อย่างไรก็ตามคุณสามารถเรียกใช้คำสั่งใด ๆ จาก PowerShell เช่นเดียวกับที่คุณทำจาก cmd.exe หรือ Cygwin มันไม่ได้ใช้ฟังก์ชั่นที่ระบุอีกครั้งและแน่นอนว่าไม่สามารถเทียบได้กับ Perl

มันเป็นเพียงแค่เชลล์ แต่ทำให้การเขียนโปรแกรมง่ายขึ้นโดยให้ส่วนต่อประสานที่สะดวกสบายกับ. NET

โปรดทราบว่า PowerShell ต้องการ Windows XP, Windows Server 2003 หรือสูงกว่าซึ่งอาจมีปัญหาขึ้นอยู่กับโครงสร้างพื้นฐานด้านไอทีของคุณ

ปรับปรุง:

ฉันไม่รู้ว่าการถกเถียงเรื่องปรัชญาของฉันเป็นอย่างไร

ฉันโพสต์คำตอบของฉันในบริบทของคำถาม: เปรียบเทียบ PowerShell กับ Cygwin และ Perl และ Bash

PowerShell เป็นเชลล์เนื่องจากไม่มีความแตกต่างทางไวยากรณ์ระหว่างคำสั่งในตัว, commandlets, ฟังก์ชั่นผู้ใช้และคำสั่งภายนอก (.exe, .bat, .cmd) เฉพาะวิธีการ. NET ที่แตกต่างกันโดยการเพิ่มเนมสเปซหรือวัตถุในการโทร

ความสามารถในการโปรแกรมของมันมาจาก. NET Framework ไม่ใช่จากสิ่งใดเฉพาะกับ "ภาษา" PowerShell

ฉันว่าฉันเชื่อว่า PowerShell เป็น "ภาษาสคริปต์" ทันทีที่BugzillaหรือMediaWikiถูกนำมาใช้เป็นสคริปต์ PowerShell ที่ทำงานบนเว็บเซิร์ฟเวอร์;)

จนแล้วเพลิดเพลินไปกับการเปรียบเทียบ


ใช่ฉันเดาเมื่อฉันพูดถึง Unix "shell" ฉันยังหมายถึงสาธารณูปโภคทั่วไปที่มาพร้อมกับ Unix เช่น grep, awk และอื่น ๆ ฉันแค่สงสัยว่า PowerShell มีสาธารณูปโภคที่คล้ายกันหมดหรือไม่ -กล่อง.
Andy White

3
Powershell ไม่ได้เป็นเพียงแค่เปลือกหอย มันเป็นภาษาสคริปต์ ฉันสงสัยในสิ่งที่มันไม่เทียบเท่ากับ perl? ฉันยอมรับว่ามันไม่ได้เป็นผู้ใหญ่ แต่ยิ่งกว่านั้นฉันไม่เห็นความแตกต่าง
EBGreen

@EBGreen คุณหมายถึงอะไรกับความคิดเห็นนี้? ฉันยอมรับว่าเชลล์หรือภาษาสคริปต์มีความคล้ายคลึงกัน แต่ฉันสงสัยเกี่ยวกับความสามารถเฉพาะของ PowerShell เทียบกับ bash / perl / unix shell อื่น ๆ / ภาษาสคริปต์
Andy White

2
Powershell มีฟังก์ชั่นหลากหลายอย่างเหลือเชื่อ มันคือ - เชลล์แบบเรียงลำดับที่โต้ตอบได้ - ภาษาสคริปต์แบบโต้ตอบที่สมบูรณ์ - ภาษาการเขียนโปรแกรมมันมีชุดฟังก์ชันยูทิลิตี้ OO & tesxt ที่หลากหลาย (เช่นเทียบเท่ากับ grep / awk / etc) เช่นกัน
Jeffrey Snover - MSFT

1
@ Andy - ฉันเข้าใจ Devio เพื่อพูดว่า PowerShell ไม่ทรงพลังเท่ากับ Perl ฉันไม่เชื่อว่าเป็นเรื่องจริงและฉันก็สงสัยว่าทำไมเขาถึงคิดว่าเป็นเช่นนั้น
EBGreen

4

cmdlet ใน PowerShell นั้นดีมากและทำงานได้อย่างน่าเชื่อถือ object-orientedness ของพวกเขาดึงดูดใจฉันมากตั้งแต่ฉันเป็นผู้พัฒนา Java / C # แต่มันไม่ได้ครบชุด เนื่องจากเป็นเชิงวัตถุจึงพลาดโอกาสครบกำหนดการสตรีมข้อความจำนวนมากของชุดเครื่องมือ POSIX ( awkและsedตั้งชื่อไม่กี่)

คำตอบที่ดีที่สุดที่ฉันได้พบกับภาวะที่กลืนไม่เข้าคายไม่ออกของความรักเทคนิค OO และการรักวุฒิภาวะในเครื่องมือ POSIX คือการใช้ทั้งสองอย่าง! ด้านหนึ่งที่ยอดเยี่ยมของ PowerShell ก็คือมันเป็นงานที่ยอดเยี่ยมในการส่งวัตถุไปยังลำธารมาตรฐาน PowerShell ตามค่าเริ่มต้นใช้ขั้นตอนการส่งวัตถุเพื่อส่งวัตถุไปรอบ ๆ นี่ไม่ใช่สตรีมมาตรฐาน (มาตรฐานหมดข้อผิดพลาดมาตรฐานและมาตรฐานเข้า) เมื่อ PowerShell ต้องการส่งผ่านเอาต์พุตไปยังกระบวนการมาตรฐานที่ไม่มีไพพ์ไลน์ของวัตถุก่อนอื่นมันจะแปลงออบเจกต์เป็นสตรีมข้อความ เนื่องจากมันทำได้ดีมาก PowerShell จึงเป็นสถานที่ที่ยอดเยี่ยมในการโฮสต์เครื่องมือ POSIX!

ที่ดีที่สุดของ POSIX ชุดเครื่องมือที่เป็นGnuWin32 ใช้เวลาในการติดตั้งนานกว่า 5 วินาที แต่มันก็คุ้มค่ากับปัญหาและเท่าที่ฉันบอกได้มันไม่ได้แก้ไขระบบของคุณ (รีจิสทรี, c:\windows\*โฟลเดอร์, ฯลฯ ) ยกเว้นการคัดลอกไฟล์ไปยังไดเรกทอรีที่คุณระบุ นี่เป็นสิ่งที่ดีเป็นพิเศษเพราะถ้าคุณวางเครื่องมือในไดเรกทอรีที่ใช้ร่วมกันหลายคนสามารถเข้าถึงได้ในเวลาเดียวกัน

คำแนะนำในการติดตั้ง GnuWin32

ดาวน์โหลดและดำเนินการexe (มันมาจากเว็บไซต์ SourceForge ) ชี้ไปที่ไดเรกทอรีที่เหมาะสม (ฉันจะใช้C:\bin) มันจะสร้างGetGnuWin32ไดเรกทอรีที่คุณจะเรียกใช้download.batจากนั้นinstall.bat(โดยไม่มีพารามิเตอร์) หลังจากนั้นจะมีC:\bin\GetGnuWin32\gnuwin32\binไดเรกทอรีที่เป็นโฟลเดอร์ที่มีประโยชน์ที่สุดที่เคยมีอยู่ในเครื่อง Windows เพิ่มไดเรกทอรีนั้นลงในเส้นทางของคุณและคุณพร้อมที่จะไป


4

TL; DR - ฉันไม่ได้เกลียด Windows หรือ PowerShell ฉันทำอะไรใน Windows หรือ PowerShell ไม่ได้


ฉันเองก็ยังพบว่า PowerShell กำลังดีที่สุด

  • การทำให้แท็บเสร็จสมบูรณ์ของเส้นทางไดเรกทอรีไม่รวมกันทำให้ผู้ใช้ต้องป้อนตัวคั่นเส้นทางหลังจากการกรอกชื่อทุกครั้ง
  • ฉันยังรู้สึกเหมือน Windows ไม่มีแม้แต่แนวคิดของเส้นทางหรือเส้นทางคืออะไรโดยไม่มีตัวบ่งชี้ผู้ใช้ภายในบ้านที่เข้าถึงได้~/สั้น ๆ@environment://somejibberish/%user_home%
  • NTFSยังคงเป็นระเบียบและดูเหมือนว่าจะเป็น ขอให้โชคดีในการนำทาง

  • cmd-esque interface, ไดโนเสาร์ cmd.exe ยังคงมองเห็นได้ใน PowerShell, แก้ไขทำเครื่องหมายว่ายังคงเป็นวิธีเดียวที่จะคัดลอกข้อมูลและการคัดลอกเฉพาะในรูปแบบของบล็อกสี่เหลี่ยมของพื้นที่เทอร์มินัลที่มองเห็นได้ และแก้ไขทำเครื่องหมายว่ายังคงเป็นวิธีเดียวที่จะวางสตริงลงในเทอร์มินัล

  • การทาสีเป็นสีฟ้าไม่ทำให้มันน่าดึงดูดอีกต่อไป ฉันไม่สนใจนักพัฒนาของ Microsoft ที่มีรสนิยมในเรื่องสี

  • Windows จะเปิดขึ้นที่มุมซ้ายบนของหน้าจอเสมอ สำหรับคนที่ใช้แถบงานแนวตั้งสิ่งนี้น่ารำคาญอย่างมากโดยเฉพาะอย่างยิ่งการพิจารณาว่าแถบงานของ Windows จะครอบคลุมเฉพาะมุมหน้าต่างที่ให้การเข้าถึงฟังก์ชันการคัดลอก / วาง

ฉันไม่สามารถพูดอะไรได้มากมายในเรื่องของเครื่องมือที่ Windows มีให้ การที่มีโอเพ่นซอร์สเครื่องมือ CLI ที่ได้รับอนุญาตทั้งชุดและ PowerShell มาพร้อมกับความรู้ของฉันทำให้ไม่มีความผิดหวังใด ๆ เลย

  • PowerShell ของ wgetใช้ข้อโต้แย้งที่หาที่เปรียบมิได้เทียบกับ GNU wget ขอขอบคุณริบหรี่แห่งความหวังที่ไร้ประโยชน์
  • PowerShell POSIX ไม่รองรับการใช้งานกับ Bash โดยเฉพาะอย่างยิ่ง&&ผู้ปฏิบัติงานที่ไม่ได้รับการจัดการทำให้คำสั่งแบบมีเงื่อนไขที่ง่ายที่สุดไม่ใช่สิ่งต่อไปนี้

ฉันไม่รู้จักผู้ชาย ฉันให้มันฉันจริง ๆ ; ฉันยังคงพยายามที่จะให้มันยิงด้วยความหวังว่าครั้งต่อไปที่ฉันเปิดมันจะไม่มีประโยชน์น้อยลง ฉันไม่สามารถทำอะไรใน PowerShell และฉันแทบจะไม่สามารถทำอะไรกับโครงการจริงเพื่อนำเครื่องมือ GNU มาสู่ Windows

MySysGit ให้ไดโนเสาร์ cmd.exe พร้อมเครื่องมือ GNU สองชุดให้ฉันและมันก็ยังไม่ท่วมท้นมาก และคำสั่ง Git จะทำงานใน Git Bash

Mintty สำหรับ MySysGit ให้ Cygwin อินเตอร์เฟสผ่านสภาพแวดล้อมของ mysysgit ทำการคัดลอกและวางสิ่งต่าง ๆ (เลือกเพื่อคัดลอก (เมาส์), Shift+ Insเพื่อวาง, ทันสมัยอย่างไร ... ) อย่างไรก็ตามสิ่งที่ชอบgit pushจะแตกในมิ้นต์

ฉันไม่ได้ตั้งใจพูดจาโผงผาง แต่ฉันก็ยังพบปัญหาใหญ่ ๆ เกี่ยวกับการใช้งานบรรทัดคำสั่งบน Windows แม้จะมีเครื่องมืออย่าง Cygwin


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


เปิดโหมด QuickEdit หรือไม่ เลือกและกด Enter เพื่อคัดลอก ctrl-v เพื่อวางไม่แก้ไข -> ทำเครื่องหมายหรือแก้ไข -> วาง ขณะที่อยู่ในค่ากำหนดให้ตั้งค่าตำแหน่งหน้าต่างและยกเลิกการเลือก "ให้ตำแหน่งระบบหน้าต่าง" การทำให้แท็บเสร็จสมบูรณ์ไม่เพียงแค่ทำพา ธ ระบบไฟล์ให้เสร็จ แต่ยังเติมชื่อตัวแปรชื่อคำสั่งคุณสมบัติวัตถุคุณอาจกำลังจะพิมพ์.หรือ[เข้าถึงคุณสมบัติหรือดัชนีดังนั้นจึงไม่สามารถเพิ่มตัวคั่นพา ธ ในตอนท้ายได้ PowerShell ตัวไหนกันแน่ PowerShell POSIX ใด มันไม่ได้พยายามที่จะนำเครื่องมือ gnu มาสู่ Windows หรือใช้ bt-compatible bash
TessellatingHeckler

ใช่ฉันรู้ว่ามันไม่ได้พยายามที่จะทุบตี ฉันละเว้นจากการพูดอย่างนั้นในโพสต์ต้นฉบับ ฉันจะบอกว่า w รับไบนารี แต่ไม่มีคำสั่ง "ไหน" ใน power shell :( ฉันจำไม่ได้ว่าซื้อที่ไหนฉันอ่าน power shell ควรจะใช้ POSIX ได้
ThorSummoner

5
อีก: "ไม่มีอัน(get-command wg*.exe).Pathไหน" -> Re: bash completeและ readline -> leeholmes.com/blog/2012/09/13/…นำไปสู่github.com/lzybkr/PSReadLine
TessellatingHeckler

2

ฉันไม่ได้เห็นว่า PowerShell ได้ถอดจริงๆแล้วอย่างน้อยก็ยังไม่ได้ ดังนั้นมันอาจไม่คุ้มค่ากับความพยายามในการเรียนรู้เว้นแต่ว่าคนอื่น ๆ ในทีมของคุณจะรู้อยู่แล้ว

สำหรับสถานการณ์ของคุณคุณอาจจะดีกว่าด้วยภาษาสคริปต์ที่คนอื่นสามารถทำได้ข้างหลัง Perl อย่างที่คุณพูดถึงหรือคนอื่น ๆ เช่น Ruby หรือ Python

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


2

ทำไมไม่ใช้ทั้งคู่? โทรสคริปต์ PowerShell ใน Cygwin เช่นเดียวกับสคริปต์ตีความอื่น ๆ เช่น Perl และอื่น ๆ

ฉันทำสิ่งนี้มากพอที่ฉันจะเขียนhttps://bitbucket.org/jbianchi/powershellสำหรับ Bash wrapper เพื่อเรียก powershell.exe ใน Cygwin มันสามารถใช้เป็นshebangเป็นบรรทัดแรกของสคริปต์ powershell.exe .ps1 (เนื่องจาก PowerShell ยังใช้ "#" เป็นความคิดเห็น) ดูhttps://bitbucket.org/jbianchi/powershell/wiki/Homeสำหรับตัวอย่าง


1

ในสองบรรทัด Cygwin และ PowerShell เป็นเครื่องมือที่แตกต่างกันอย่างไรก็ตามถ้าคุณติดตั้ง Cygwin ไว้คุณสามารถเรียกใช้งาน Cygwin ได้ภายในเซสชัน PowerShell ฉันคุ้นเคยกับ PowerShell แล้วตอนนี้ฉันไม่ได้ใช้ grep, sort, awk และอื่น ๆ อีกมากมายมีตัวเลือกในตัวใน PowerShell และถ้าคุณไม่สามารถหา cmdlet ได้

เครื่องมือหลักที่ฉันพบว่าใช้คือ ssh.exe แต่อยู่ในช่วง PowerShell

มันใช้งานได้ดี


0

ฉันพบว่าการเขียนโปรแกรม PowerShell ไม่คุ้มค่ากับความพยายาม

ฉันมีประสบการณ์หลายปีกับการเขียนสคริปต์เชลล์ภายใต้ระบบปฏิบัติการยูนิกซ์ แต่ฉันพบว่ามันยากอย่างมากที่จะทำอะไรกับ PowerShell

ดูเหมือนว่าฟังก์ชั่นหลายอย่างจำเป็นต้องให้คุณทำการสอบปากคำ Windows Management Interface และออกคำสั่งคล้าย SQL เพื่อรับข้อมูลที่คุณต้องการ

ตัวอย่างเช่นฉันต้องการเขียนสคริปต์เพื่อลบไฟล์ทั้งหมดด้วยคำต่อท้ายที่เฉพาะเจาะจงจากต้นไม้ไดเรกทอรี ภายใต้ระบบปฏิบัติการยูนิกซ์นี่จะง่าย ...

find . -name \*.xyz -exec rm {} \;

หลังจากสองสามชั่วโมงผ่านไปรอบ ๆ ด้วยScripting.FileSystemObjectและWScript.Shellออก "SELECT * FROM Win32_ShortcutFile WHERE Drive = '" & drive & "' AND Path = '" & searchFolder & "'" ในที่สุดฉันก็ยอมแพ้และตัดสินการค้นหาของ Windows Explorerคำสั่งการและ เพียงทำด้วยตนเอง อาจมีวิธีที่จะทำสิ่งที่ฉันต้องการ แต่ฉันไม่เห็นอะไรชัดเจนและตัวอย่างทั้งหมดในเว็บไซต์ MSDN นั้นมีความสำคัญมากจนไร้ค่า

แก้ไขห่าแน่นอนเมื่อฉันเขียนสิ่งนี้ฉันแหย่ไปรอบ ๆ และพบสิ่งที่ฉันหายไป: -recurseตัวเลือกสำหรับคำสั่งลบรายการเป็นความผิดพลาด (เปิดเผยถ้าคุณใช้get-help remove-item -detailed)

ฉันพยายาม "ลบรายการ - ตัวกรอง '* .xyz' - บัญชี" และมันไม่ทำงานดังนั้นฉันจึงยอมแพ้

ปรากฎว่าคุณต้องใช้ get-childitem -filter '*.xyz' -recurse | remove-item


16
ฉันคิดว่าคุณสับสน Windows Scripting Host (WSH) กับ PowerShell พวกมันต่างกันโดยสิ้นเชิง
Erik Funkenbusch

3
ตัวอย่างเช่นหากคุณต้องการลบไฟล์ทั้งหมดที่ลงท้ายด้วย. TMN คุณสามารถออกคำสั่งนี้ get-childitem c: \ -include * .TMN -recurse | foreach ($ _) {ลบรายการ $ _. ชื่อเต็ม}
Erik Funkenbusch

@Mystere: ฉันพยายามทำสิ่งนี้และดูเหมือนจะไม่ทำงาน หลังจากที่พูดถึงบางอย่างเกี่ยวกับมันดูเหมือนว่า * .tmn คือสิ่งที่คุณต้องการ (แทนที่จะเป็นเพียงแค่. tmn)
redtuna

5
ฉันไม่เห็นด้วยอย่างไม่เคารพอีกต่อไปและฉันก็ไม่ได้เป็นผู้ชาย Windows ฉันพบว่าสคริปต์ PS ง่ายกว่าทุบตีมาก PS สอดคล้องกันมากขึ้น ด้วย Bash ยูทิลิตี้คอนโซลที่คุณเรียกใช้มีไวยากรณ์ของตัวเองและพฤติกรรมที่ไม่ซ้ำกันและไวยากรณ์ของ bash นั้นค่อนข้างเป็นความลับ PS มีความทนทานมากขึ้นด้วยคุณสมบัติภาษาเช่นฟังก์ชั่นที่ไม่ระบุชื่อ (scriptblocks), การตรวจสอบพารามิเตอร์, ฟังก์ชั่นขั้นสูง ฯลฯ รวมถึงแนวคิดของโมดูลสำหรับการพกพาและคุณสมบัติอื่น ๆ อีกมากมาย แม้ว่าเหตุผลหลักคือสิ่งที่คุณได้ยินเกี่ยวกับ PS เสมอวัตถุข้อความทรัมป์ Bash ยังเร็วกว่า
2233949

0

นอกจากนี้คุณยังสามารถลองเรียกใช้สคริปต์ทุบตีบน Windows โดยใช้ BashWin ที่ https://github.com/skanga/BashWin


0

PowerShell นั้นทรงพลังมากและทรงพลังกว่ามาตรฐานในตัวของ Unix shells (แต่เนื่องจากมันมีฟังก์ชั่นการใช้งานส่วนใหญ่ที่มักใช้ในโปรแกรมย่อย) นอกจากนี้ยังพิจารณาว่าคุณสามารถเขียนแอปเพล็ในภาษา .NET ใด ๆ รวมทั้งIronPython , IronRuby , PerlNet ฯลฯ .. หรือคุณสามารถเรียกคำสั่ง Cygwin ของคุณจาก PowerShell ละเว้นทุกฟังก์ชันการทำงานพิเศษและมันจะทำงานคล้ายกับทุบตีKornShell , หรืออะไรก็ตาม ...


ฉันคิดว่าคุณอาจพลาดเป้าหมายการออกแบบของ Unix shells การไม่เคาะ PowerShell (ต้องการเรียนรู้เพิ่มเติมด้วยตนเอง) แต่คุณต้องเข้าใจการใช้เครื่องมือ Unix ในการสร้างข้อความเช่นนั้น
Jé Queue

2
@Xepoch - ไม่ฉันคิดว่าคุณพลาดเป้าหมายการออกแบบของ PowerShell PowerShell สามารถทำทุกอย่างที่เชลล์ Unix สามารถทำได้ในแบบเดียวกับที่พวกมันทำ อย่างไรก็ตามพลังที่แท้จริงนั้นเกิดขึ้นเมื่อคุณใช้ระบบการวางออบเจ็กต์ของ PS แทนที่จะแยกวิเคราะห์ข้อความ ดังนั้น PowerShell สามารถทำสิ่งที่ bash หรือ korn สามารถทำได้ แต่พวกเขาไม่สามารถทำสิ่งที่ PowerShell สามารถทำได้
Erik Funkenbusch

3
ฉันไม่รู้ PowerShell มากพอที่จะให้คำวิจารณ์แก่คุณ แต่เมื่อคุณทราบอย่างชัดเจนว่าเป้าหมายของ Unix shells นั้นไม่จำเป็นต้องทดแทนทูลภายนอกทั้งหมดอย่างสมบูรณ์แทนที่จะเป็นโครงสร้างการควบคุมรอบ ๆ อีกครั้งฉันไม่สามารถเปรียบเทียบหรือเปรียบต่างได้ แต่ยกระดับ PowerShell เนื่องจากมีบิวด์อินเพิ่มเติมไม่จำเป็นต้องเป็นสิ่งที่ดีของเชลล์ Unix
Jé Queue

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