PowerShell đã sẵn sàng để thay thế trình bao Cygwin của tôi trên Windows chưa? [đóng cửa]


384

Tôi đang tranh luận liệu tôi nên học PowerShell hay chỉ gắn bó với các tập lệnh Cygwin / Perl / tập lệnh shell Unix, v.v.

Lợi ích của PowerShell là các tập lệnh có thể được sử dụng dễ dàng hơn bởi các đồng đội không có Cygwin; tuy nhiên, tôi không biết liệu tôi có thực sự viết nhiều kịch bản cho mục đích chung hay không, hay mọi người thậm chí sẽ sử dụng chúng.

Kịch bản Unix rất mạnh, PowerShell có đủ gần để đảm bảo chuyển đổi không?

Dưới đây là một số điều cụ thể (hoặc tương đương) mà tôi sẽ tìm kiếm trong PowerShell:

  • grep
  • sắp xếp
  • uniq
  • Perl (PowerShell gần với khả năng của Perl đến mức nào?)
  • AWK
  • quyến rũ
  • tệp (lệnh cung cấp thông tin tệp)
  • Vân vân.

7
Tôi sẽ không nói rằng, tôi đã quan tâm đến việc chọn Powershell, tìm thấy trang này và bây giờ tôi biết sự khác biệt chung giữa PS và kịch bản shell tôi đã từng sử dụng.
Bender vĩ đại nhất

5
Bài này đột nhiên tăng từ đống tro tàn trong một bài đăng liên kết HN. Công việc tuyệt vời Và thật tệ cho @Bulk vì đã đóng cái này không mang tính xây dựng.
Sid

26
Nếu ai đó không thể hỏi một công cụ sao chép các chức năng của công cụ khác tốt như thế nào thì SO không thể trả lời các câu hỏi so sánh công cụ. Điều này được diễn đạt cẩn thận để tránh tranh cãi nhưng được coi là "gây tranh cãi" chỉ đơn giản là trông giống như một câu hỏi Unix vs Windows. Và nó đã nhận được một câu trả lời thực tế, khách quan, với cái nhìn sâu sắc thực tế hơn về việc kịch bản Unix có thể hữu ích như thế nào trên Windows.
chernevik

16
Tại sao điều này lại đóng cửa, một lần nữa? Ai đó vui lòng chỉnh sửa tiêu đề để nói "PowerShell vs Unix Shells trên Nền tảng Windows" để tránh các trolls khỏi việc coi nó là "Windows vs Unix", điều này không phải. Đây là một câu hỏi hoàn hảo mang tính xây dựng - được bình chọn để mở lại.
x0n

3
Các op đang trộn vỏ với các công cụ. PowerShell có công dụng của nó. Nhưng GNU là một dự án mang các tính năng UNIX tự do đến các HĐH khác, bao gồm cả Windows. Mọi thứ trong danh sách op đưa ra đều có cách triển khai gnu trong Windows. Có thể truy cập từ GnuWin32 hoặc các trang web cá nhân. Windows BAT không vô dụng, nó có chuyển hướng và đường ống và điều kiện.
MeaCulpa

Câu trả lời:


783

Công cụ chỉ là công cụ.
Họ giúp đỡ hoặc họ không.
Bạn cần giúp đỡ hoặc bạn không.

Nếu bạn biết Unix và những công cụ đó làm những gì bạn cần chúng làm trên Windows - thì bạn là một người vui vẻ và không cần phải học PowerShell (trừ khi bạn muốn khám phá).

Mục đích ban đầu của tôi là bao gồm một bộ công cụ Unix trong Windows và được thực hiện với nó (một số người trong nhóm chúng tôi có nền tảng Unix sâu sắc và một sự tôn trọng lành mạnh đối với cộng đồng đó.)

Những gì tôi tìm thấy là điều này thực sự không giúp được nhiều. Lý do cho điều đó là AWK / grep / sed không hoạt động chống lại COM , WMI , ADSI , Registry, kho lưu trữ chứng chỉ, v.v., v.v.

Nói cách khác, UNIX là toàn bộ hệ sinh thái tự điều chỉnh xung quanh các tệp văn bản. Như vậy, các công cụ xử lý văn bản là công cụ quản lý hiệu quả. Windows là một hệ sinh thái hoàn toàn khác nhau tự điều chỉnh xung quanh API và Đối tượng. Đó là lý do tại sao chúng tôi đã phát minh ra PowerShell.

Những gì tôi nghĩ bạn sẽ thấy là sẽ có rất nhiều dịp khi xử lý văn bản sẽ không mang lại cho bạn những gì bạn muốn trên Windows. Tại thời điểm đó, bạn sẽ muốn chọn PowerShell. LƯU Ý - nó không phải là một thỏa thuận tất cả hoặc không có gì. Trong PowerShell, bạn có thể gọi ra các công cụ Unix của mình (và sử dụng quy trình văn bản của chúng hoặc xử lý văn bản của PowerShell). Ngoài ra, bạn có thể gọi PowerShell từ các công cụ Unix của mình và nhận văn bản.

Một lần nữa - không có tôn giáo nào ở đây - trọng tâm của chúng tôi là cung cấp cho bạn các công cụ bạn cần để thành công. Đó là lý do tại sao chúng tôi rất say mê phản hồi. Hãy cho chúng tôi biết nơi chúng tôi rơi vào công việc hoặc nơi bạn không có công cụ bạn cần và chúng tôi sẽ đưa nó vào danh sách và tìm đến nó.

Thành thật mà nói, chúng tôi đang tự đào ra khỏi một cái hố 30 năm, vì vậy sẽ mất một thời gian. Điều đó nói rằng, nếu bạn chọn bản beta của Windows Server 2008 / R2 và / hoặc betas của các sản phẩm máy chủ của chúng tôi, tôi nghĩ bạn sẽ bị sốc về việc lỗ hổng đó được lấp đầy nhanh như thế nào.

Liên quan đến việc sử dụng - chúng tôi đã có> 3,5 triệu lượt tải xuống cho đến nay. Điều đó không bao gồm những người sử dụng nó trong Windows Server 2008, vì nó được bao gồm dưới dạng một thành phần tùy chọn và không cần tải xuống.

V2 sẽ xuất xưởng trong tất cả các phiên bản Windows. Nó sẽ được mặc định cho tất cả các phiên bản ngoại trừ lõi Máy chủ nơi nó là một thành phần tùy chọn. Ngay sau khi Windows 7 / Windows Server 2008 R2 xuất xưởng, chúng tôi sẽ cung cấp V2 trên tất cả các nền tảng, Windows XP trở lên. Nói cách khác - khoản đầu tư vào học tập của bạn sẽ được áp dụng cho một số lượng lớn máy móc / môi trường.

Một bình luận cuối cùng. Nếu / khi bạn bắt đầu học PowerShell, tôi nghĩ bạn sẽ khá hạnh phúc. Phần lớn thiết kế bị ảnh hưởng nặng nề bởi nền tảng Unix của chúng tôi, vì vậy trong khi chúng tôi khá khác biệt, bạn sẽ nhận được nó rất nhanh (sau khi bạn nhận ra rằng nó không phải là Unix :-)).

Chúng tôi biết rằng mọi người có ngân sách rất hạn chế cho việc học - đó là lý do tại sao chúng tôi cực kỳ khó tính về tính nhất quán. Bạn sẽ học một cái gì đó, và sau đó bạn sẽ sử dụng nó nhiều lần.

Thí nghiệm! Thưởng thức! Thuê!


11
Cảm ơn câu trả lời của bạn. Tôi nghĩ rằng tôi sẽ tiếp tục và học PowerShell. Nó trông mạnh mẽ từ những gì tôi đã thấy cho đến nay và tôi sẽ có thể viết các kịch bản hữu ích hơn với nó tại nơi làm việc.
Andy White

55
@Jeffrey: có cơ hội cho một thiết bị đầu cuối tốt hơn cho Windows không? Powershell là một ngôn ngữ kịch bản mạnh mẽ, nhưng thực tế nó chạy trong cmd.exe giúp nó thuận tiện hơn nhiều trong chế độ tương tác
sumek

47
Câu hỏi "không mang tính xây dựng" này đã tạo ra cái nhìn sâu sắc nhất mà tôi đã thấy trong toàn bộ câu thần chú "trên Unix mọi thứ đều là một tập tin" và tại sao Windows lại khác. Có lẽ StackOverflow sẽ được phục vụ tốt hơn khi kết thúc các cuộc thảo luận không mang tính xây dựng ?
chernevik

12
@sumek - Hãy thử ConEmu; Tôi đã sử dụng nó được vài tuần và nó khá ngọt ngào: hanselman.com/blog/ mẹo
EZ Hart

4
Cảnh giác: powershell không thích đường ống dữ liệu nhị phân. Vì vậy, hãy cẩn thận khi bạn gọi các công cụ Unix đáng tin cậy của mình, đừng làm những việc như tar -c . | gzip > package.tar.gz trực tiếp trong PowerShell, hoặc bạn sẽ phải chịu đựng. Xem brianreiter.org/2010/01/29/ trên
Interarticle

123

grep

Select-Stringcmdlet và -matchtoán tử làm việc với regexes. Ngoài ra, bạn có thể trực tiếp sử dụng hỗ trợ regex của .NET để có chức năng nâng cao hơn.

sắp xếp

Sort-Objectmạnh hơn (tôi nhớ * nix's sort). Cho phép sắp xếp đa cấp trên các biểu thức tùy ý. Ở đây PowerShell bảo trì loại cơ bản giúp; ví dụ: một thuộc DateTimetính sẽ được sắp xếp dưới dạng DateTimemà không phải đảm bảo định dạng thành định dạng có thể sắp xếp.

uniq

Select-Object -Unique

Perl (PowerShell gần với khả năng của Perl đến mức nào?)

Xét về độ rộng của Perl của các thư viện hỗ trợ cụ thể cho miền: không nơi nào đóng (chưa).

Đối với lập trình chung, PowerShell chắc chắn gắn kết và nhất quán hơn và dễ dàng mở rộng hơn. Khoảng trống cho việc trộn văn bản là một cái gì đó tương đương với ..toán tử của Perl .

AWK

Đã đủ lâu kể từ khi sử dụng AWK (phải> 18 năm, vì sau này tôi mới sử dụng Perl), vì vậy không thể thực sự nhận xét.

quyến rũ

[Xem ở trên]

tệp (lệnh cung cấp thông tin tệp)

Sức mạnh của PowerShell ở đây không phải là quá nhiều so với những gì nó có thể làm với các đối tượng hệ thống tập tin (và nó có được thông tin đầy đủ ở đây, dirtrả về FileInfohoặc FolderInfocác đối tượng phù hợp) là toàn bộ mô hình nhà cung cấp.

Bạn có thể coi sổ đăng ký, kho lưu trữ chứng chỉ, SQL Server, bộ đệm RSS của Trình thám hiểm Internet, v.v. như một không gian đối tượng có thể điều hướng bằng các lệnh ghép ngắn giống như hệ thống tệp.


PowerShell chắc chắn là con đường phía trước trên Windows. Microsoft đã biến nó thành một phần yêu cầu của họ đối với các sản phẩm không phải là nhà trong tương lai. Do đó hỗ trợ phong phú trong Exchange, hỗ trợ trong SQL Server. Điều này sẽ chỉ mở rộng.

Một ví dụ gần đây là TFS PowerToys. Nhiều thao tác máy khách TFS được thực hiện mà không phải khởi động tf.exe mỗi lần (yêu cầu kết nối máy chủ TFS mới, v.v.) và đáng chú ý là sau đó xử lý dữ liệu dễ dàng hơn. Cũng như cho phép truy cập rộng rãi vào toàn bộ API máy khách TFS đến một chi tiết lớn hơn được hiển thị trong Team Explorer của TF.exe.


2
Vấn đề là mô hình nhà cung cấp chỉ thú vị vì HĐH không sử dụng văn bản làm phương tiện cấu hình chung, vì vậy bạn CẦN các nhà cung cấp này. Với UNIX, hầu hết các ngôn ngữ đều có API để chạm vào PAM, máy chủ và gói, nhưng cuối cùng văn bản sẽ luôn ở đó.
Daishiman

12
Văn bản không phải lúc nào cũng là định dạng tốt nhất cho mọi thứ (bắt đầu với cơ sở dữ liệu và hình ảnh raster). Nhưng tôi nghĩ chúng ta có thể đồng ý không đồng ý thay vì chiến tranh định dạng mở.
Richard

5
Powershell có thể sử dụng bất kỳ đối tượng nào trong .NET framework, điều này không phù hợp với khả năng miền của Perl? Ngoài ra, bạn có thể viết các lệnh ghép ngắn trong C #, v.v. nếu bạn muốn sử dụng lại
Chris S

Từng điểm so sánh. Đẹp một. Đây phải là câu trả lời được chấp nhận. Sức mạnh của PowerShell nằm ở nền tảng .NET của nó và bạn có thể mở rộng hệ thống dễ dàng như thế nào bằng cách viết Cmdlets mới hoặc thậm chí gọi các thư viện lớp
Sau001

Một cách sử dụng sed điển hình (tôi nghĩ) sẽ là : sed 's/pattern/replacement/' file, đại khái gc file | %{$_ -replace 'pattern','replacement'}và tương tự cho awk: awk 'BEGIN {} /pat1/ {action1} /pat2/ {action2} END {}' fileđại khái là{BEGIN {}; switch -r -c -file file { 'pat1' {action1} 'pat2' {action2}}; END{};}
Nathan Chappell

56

Là một người có sự nghiệp tập trung vào phát triển doanh nghiệp Windows từ 1997 - 2010, câu trả lời rõ ràng sẽ là PowerShell vì tất cả các lý do chính đáng được đưa ra trước đây (ví dụ: đây là một phần của chiến lược doanh nghiệp của Microsoft; nó tích hợp tốt với Windows / COM / .NET; và sử dụng các đối tượng thay vì các tệp cung cấp cho một mô hình mã hóa "phong phú hơn"). Vì lý do đó, tôi đã sử dụng và quảng bá PowerShell trong hai năm qua hoặc lâu hơn, với niềm tin rõ ràng tôi đã theo dõi "Lời của hóa đơn".

Tuy nhiên, là một người theo chủ nghĩa thực dụng, tôi không còn chắc chắn PowerShell là một câu trả lời tuyệt vời như vậy. Mặc dù đây là một công cụ Windows tuyệt vời và cung cấp một bước rất cần thiết để lấp đầy lỗ hổng lịch sử đó là dòng lệnh Window, vì tất cả chúng ta đều chứng kiến ​​sự kìm kẹp của máy tính tiêu dùng của Microsoft, dường như Microsoft ngày càng có một cuộc chiến lớn để giữ HĐH của mình quan trọng đối với doanh nghiệp của tương lai.

Thật vậy, khi tôi thấy công việc của mình ngày càng trong môi trường không đồng nhất, tôi thấy việc sử dụng các tập lệnh Bash vào lúc này rất hữu ích, vì chúng không chỉ hoạt động trên Linux, Solaris và Mac OS X, mà chúng còn hoạt động với Trợ giúp của Cygwin trên Windows.

Vì vậy, nếu bạn tin tưởng rằng tương lai của HĐH sẽ được thương mại hóa chứ không phải là độc quyền, thì có vẻ hợp lý khi lựa chọn chiến lược công cụ phát triển nhanh, tránh xa các công cụ độc quyền khi khả thi. Tuy nhiên, nếu bạn thấy tương lai của mình bị chi phối bởi tất cả những gì đó là Redmond thì hãy đến với PowerShell.


1
Các tập lệnh unix có hoạt động hoàn hảo trên Cygwin-Windows không có lỗi không?
Pacerier

@Pacerier Tôi đã sử dụng Cygwin và MinGW được 12 năm và hiếm khi gặp sự cố. Điều quan trọng là nếu một cái gì đó không hoạt động, bạn luôn có thể quay trở lại với các công cụ Windows hoặc bất cứ điều gì - các quy trình có thể được bắt đầu giống như bất kỳ trình bao nào khác khởi động chúng.
Evgeni Sergeev

4
Được rồi, câu trả lời của bạn là từ năm 2011. Hôm nay powershell cũng chạy trên linux. Và - ý kiến ​​cá nhân của tôi - bash là quá cổ xưa. Cú pháp thật kinh khủng và tôi thà sử dụng một ngôn ngữ kịch bản khác. Ngày nay, với python là tiêu chuẩn trên hầu hết các bản phân phối linux, tôi không thấy bất kỳ lý do nào để sử dụng bash cho các tập lệnh. Tôi khuyên bạn nên kiểm tra lại quyền hạn vì đã xảy ra rất nhiều kể từ năm 2011
itmuckel


33

Tôi đã sử dụng một chút PowerShell để tự động hóa tập lệnh. Mặc dù thật tuyệt khi môi trường dường như đã được nghĩ ra nhiều hơn so với shell Unix, nhưng trên thực tế, việc sử dụng các đối tượng thay vì các luồng văn bản trở nên cồng kềnh hơn rất nhiều và rất nhiều phương tiện Unix đã được phát triển trong 30 vừa qua năm vẫn mất tích.

Cygwin vẫn là môi trường kịch bản lựa chọn của tôi cho các máy chủ Windows. Nó chắc chắn đánh bại các lựa chọn thay thế về việc hoàn thành công việc.


27
Sử dụng các đối tượng là một sự thay đổi mô hình và mất một số làm quen. Nhưng tránh toàn bộ phân tích lại ở mỗi bước có liên quan đến dữ liệu có cấu trúc (ví dụ: không cần đảm bảo các trường được phân cách).
Richard

16
@Andy White @Daishiman, tôi có thể hiểu nơi nào có đường cong học tập với PowerShell, nhưng các đối tượng đường ống có thể linh hoạt hơn nhiều so với văn bản đường ống. @Richard đúng. :)
Steven Murawski

18
Các nhà sản xuất ô tô đã có một thời gian khó khăn để tranh cãi với hơn 1000 năm ngựa. Tôi không cố tỏ ra thiếu sót. Chỉ chỉ ra rằng thành công trong quá khứ không loại bỏ lợi ích tiềm năng của đổi mới.
EBGreen

12
@daishiman - Lợi ích của Đối tượng là khi bạn muốn có một tài sản, bạn yêu cầu nó - bạn không phải phân tích, đoán, bỏ. Tôi không hiểu quan điểm của bạn về "điều gì xảy ra khi các đối tượng không có phương thức tương thích" - Bạn có thể nói theo cách khác hoặc đưa ra một ví dụ về vấn đề không? Cảm ơn.
Jeffrey Snover - MSFT

13
@Daishiman - Tôi hiểu. Trong thực tế mọi người đã tìm thấy điều này không phải là một vấn đề mà là một lợi thế rất lớn. Điều đó nói rằng, tôi có thể thấy rằng nếu bạn là một chuyên gia phân tích văn bản, đây sẽ là một kỹ năng mới để học và ban đầu nó có thể cảm thấy không cần thiết và lúng túng. Một lần nữa - bất cứ điều gì giúp là công cụ phù hợp.
Jeffrey Snover - MSFT

15

Có rất nhiều câu trả lời tuyệt vời ở đây, và đây là của tôi. PowerShell đã sẵn sàng nếu bạn ... Ví dụ:

grep = " Chọn chuỗi -Potype "

sắp xếp = "Sắp xếp đối tượng"

uniq = " Độc đáo "

file = " Nhận vật phẩm "

cat = " Nhận nội dung "

Perl / AWK / Sed không phải là các lệnh, nhưng các tiện ích do đó khó so sánh, nhưng bạn có thể làm hầu hết mọi thứ trong PowerShell.


2
Bạn có thể tin rằng các lệnh bốn chữ cái khó hiểu mà tổ tiên chúng ta đã buộc phải sử dụng không?
Evgeni Sergeev

4
@EvgeniSergeev Tất cả ở trên là có sẵn theo mặc định như sls, sort, gu, gi, gc, tương ứng. Tên dài có thể đọc được mà hoàn thành tab và tên ngắn có thể gõ trong một hệ thống. Đó là tiến bộ thân thiện với người dùng cho bạn.
TessellatingHeckler

Một trong những bí danh Get-Contentcat, vì vậy, không có sự khác biệt nào giữa Cygwin / Unix và PowerShell. Thật không may, trong hầu hết các trường hợp, tài liệu của Microsoft cho các lệnh ghép ngắn đang thiếu thông tin về các bí danh, nhưng một danh sách tất cả các bí danh được xuất ra bằng cách sử dụngGet-Alias trong phiên PowerShell. Bí danh của "Get-Unique" là "gu", do đó ngắn hơn so với Cygwin / Unix!
Peter Mortensen

13

Gần đây tôi mới bắt đầu học hỏi về PowerShell với bất kỳ mức độ nghiêm trọng nào. Mặc dù trong bảy năm qua tôi đã làm việc trong một môi trường gần như chỉ dựa trên Windows, tôi đến từ nền tảng Unix và thấy mình liên tục cố gắng "Unix-fy" trải nghiệm tương tác của tôi trên Windows. Ít nhất là bực bội khi nói.

Thật công bằng khi so sánh PowerShell với một cái gì đó như Bash , tcsh hoặc zsh vì các tiện ích như grep , sed , awk , find , v.v. không, nói đúng ra là một phần của vỏ; tuy nhiên, chúng sẽ luôn là một phần của bất kỳ môi trường Unix nào. Điều đó nói rằng, một lệnh PowerShell như Chuỗi chọn có chức năng rất giống với grepđược đóng gói như một mô-đun lõi trong PowerShell ... vì vậy các dòng có thể bị mờ đi một chút.

Tôi nghĩ điều quan trọng là văn hóa và thực tế là các bộ công cụ tương ứng sẽ thể hiện văn hóa tương ứng của họ:

  • Unix là một tập tin dựa trên , (nói chung Unicode, không) dựa trên văn bản văn hóa. Các tập tin cấu hình hầu như chỉ có văn bản các tập tin . Mặt khác, Windows luôn được cấu trúc chặt chẽ hơn nhiều so với các định dạng cấu hình - cấu hình thường được giữ trong cơ sở dữ liệu độc quyền (ví dụ: sổ đăng ký Windows) yêu cầu các công cụ chuyên dụng để quản lý.
  • Giao diện quản trị Unix (và, trong nhiều năm, phát triển) theo truyền thống là dòng lệnh và thiết bị đầu cuối ảo. Windows khởi đầu là một GUI và các chức năng quản trị chỉ vừa mới bắt đầu chuyển sang sử dụng GUI độc quyền . Chúng ta có thể hy vọng trải nghiệm Unix trên dòng lệnh sẽ phong phú hơn, trưởng thành hơn nhờ có sự dẫn dắt đáng kể trên PowerShell và trải nghiệm của tôi phù hợp với điều này. Về điều này, theo kinh nghiệm của tôi:

    • Trải nghiệm quản trị Unix hướng đến việc làm cho mọi thứ dễ dàng thực hiện trong một số lượng tối thiểu các nét chính; đây có lẽ là kết quả của tình huống lịch sử của việc phải quản trị máy chủ qua kết nối quay số chậm 9600 baud. Bây giờ PowerShell có các bí danh đi một chặng đường dài để đi xung quanh tiêu chuẩn Verb-Noun khá dài dòng , nhưng làm quen với các bí danh đó là một chút đau khổ (bất cứ ai cũng biết về điều gì đó tốt hơn : alias | where {$_.ResolvedCommandName -eq "<command>"}?).

      Một ví dụ về cách phong phú trong đó lịch sử có thể bị thao túng:

      iptablescác lệnh thường dài dòng và lặp đi lặp lại chúng với một chút khác biệt sẽ là một nỗi đau nếu nó không phải là một trong nhiều tính năng gọn gàng của thao tác lịch sử được tích hợp trong Bash , do đó, chèn một quy tắc iptables như sau:

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

      lần thứ hai cho một máy ảnh khác (" camera-2"), chỉ là một trường hợp phát hành:

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

      có nghĩa là "thực hiện lệnh trước đó, nhưng thay thế -1-bằng -2-50bằng 51.

    • Trải nghiệm Unix được tối ưu hóa cho người đánh máy cảm ứng; một người có thể làm khá nhiều việc mà không cần rời khỏi vị trí "nhà". Ví dụ, trong Bash , sử dụng ràng buộc khóa Emacs (vâng, Bash cũng hỗ trợ các ràng buộc vi ), việc chuyển qua lịch sử được thực hiện bằng cách sử dụng Ctrl-PCtrl-Ntrong khi di chuyển đến đầu và cuối của một dòng được thực hiện bằng cách sử dụng Ctrl-ACtrl-Etương ứng ... và nó chắc chắn không kết thúc ở đó Hãy thử ngay cả cách điều hướng đơn giản nhất trong bảng điều khiển PowerShell mà không di chuyển khỏi vị trí nhà và bạn đang gặp rắc rối.

    • Những thứ đơn giản như phân trang đa năng ( ít hơn ) trên Unix dường như không có sẵn trong PowerShell, điều này hơi khó chịu và trải nghiệm biên tập phong phú cũng không tồn tại. Tất nhiên, người ta luôn có thể tải xuống các công cụ của bên thứ ba sẽ lấp đầy những khoảng trống đó, nhưng chắc chắn sẽ rất tuyệt nếu những thứ này chỉ "ở đó" giống như chúng có khá nhiều hương vị của Unix.
  • Văn hóa Windows, ít nhất là về API hệ thống chủ yếu được điều khiển bởi các khung hỗ trợ, viz., COM.NET , cả hai - có cấu trúc cao và dựa trên đối tượng. Mặt khác, truy cập vào các API Unix theo truyền thống thông qua các lệnh gọi thư viện kiểu C ( /dev/proc) hoặc (không hướng đối tượng). Sau đó, không có gì ngạc nhiên khi các trải nghiệm kịch bản phù hợp với mô hình hệ điều hành tương ứng của họ. Bản chất PowerShell có cấu trúc (mọi thứ đều là đối tượng) và dựa trên tệp Bash -and-friends. API có cấu trúc được xử lý bởi một lập trình viên PowerShell là rất lớn (về cơ bản phù hợp với sự rộng lớn của bộ giao diện COM và .NET tiêu chuẩn hiện có ).

Nói tóm lại, mặc dù khả năng tạo kịch bản của PowerShell mạnh hơn Bash (đặc biệt là khi bạn xem xét tính khả dụng của .NET BCL ), trải nghiệm tương tác yếu hơn đáng kể, đặc biệt nếu bạn đến với nó từ điều khiển hoàn toàn bằng bàn phím , phối cảnh dựa trên bảng điều khiển (như nhiều người đứng đầu Unix).


Bạn hỏi "có ai biết điều gì tốt hơn: bí danh | trong đó {$ _. ResolveCommandName -eq" <lệnh> "}?". Làm thế nào về chỉ alias -Definition *property(hoặc bất kỳ mô hình khác)? Tôi nghĩ rằng vấn đề với câu trả lời của bạn là bạn đang kết hợp vỏ và bảng điều khiển: hãy nhớ rằng bạn có một sự lựa chọn của bảng điều khiển với các tùy chọn chỉnh sửa khác nhau. Họ cố tình để việc chỉnh sửa bảng điều khiển DOS bị hỏng để khuyến khích mọi người sử dụng các bảng điều khiển khác như ISE.
Duncan

BTW, !!ví dụ của bạn có thể được viết bằng Powershell (h -c 1) -replace '-1-','-2-' -replace '50','51' | iexnhưng việc mũi tên và chỉnh sửa cho một lệnh dễ dàng hơn. Nếu bạn muốn thực hiện nó qua rất nhiều mệnh lệnh, tôi nghĩ Powershell sẽ thắng. Để lặp lại 10 lệnh kết thúc tại lệnh # 255 với các chỉnh sửa của bạn: (h -c 10 -id 255) -replace '-1-','-2-' -replace '50','51' | iexNgoài ra lịch sử của Powershell cho phép bạn thực hiện những điều chưa từng thấy trong các vỏ Linux; nếu bạn tự hỏi hồi tưởng lại chỉ cần một lệnh chạy trong bao lâu:h -id 20 | select { $_.EndExecutionTime - $_.StartExecutionTime }
Duncan

@Duncan Đối với bình luận của bạn là vỏ và bảng điều khiển - Tôi nghĩ rằng đó chỉ là một sự khác biệt cơ bản giữa Bash và PS; đó là: Bash hy vọng sẽ mang lại trải nghiệm tương tác nhất định trong khi PS "để lại" điều đó cho người khác. Tôi không có nhiều kinh nghiệm với bảng điều khiển ISE, nhưng từ tôi có thể nhớ, nó cũng không có trải nghiệm tương tác vô cùng phong phú.
Eric Smith

@Duncan, vâng - điểm hay về khả năng của PS trong việc cung cấp các thủ thuật lịch sử thông minh.
Eric Smith

@Duncan ... nhưng mặc dù bạn khẳng định rằng một số điều chưa từng thấy trong các vỏ Linux:fc -e "sed -i -e 's/-1-/-2-/g' -e 's/50/51/g'" 10 255
Eric Smith

8

Tôi không phải là người dùng PowerShell có nhiều kinh nghiệm bằng bất kỳ phương tiện nào, nhưng một chút trong số đó tôi đã tiếp xúc để gây ấn tượng với tôi rất nhiều. Bạn có thể xâu chuỗi các lệnh ghép ngắn tích hợp lại với nhau để làm bất cứ điều gì bạn có thể làm tại dấu nhắc Unix và có một số điều tốt nữa để thực hiện những việc như xuất sang CSV, bảng HTML và cho các loại công việc quản trị hệ thống chuyên sâu hơn .

Và nếu bạn thực sự cần thứ gì đó như sed , luôn có UnixUtils hoặc GnuWin32 , thứ mà bạn có thể tích hợp với PowerShell khá dễ dàng.

Là một người dùng Unix lâu năm, tuy nhiên tôi đã gặp một chút rắc rối khi làm quen với sơ đồ đặt tên lệnh và tôi chắc chắn sẽ được hưởng lợi nhiều hơn từ nó nếu tôi biết nhiều .NET hơn.

Vì vậy, về cơ bản, tôi nói rằng nó cũng đáng để học nó nếu tính năng duy nhất của Windows không gây ra vấn đề gì.


1
Có một dự án mã nguồn mở "Pash" cho phép bạn chạy PowerShell trên các nền tảng khác thông qua Mono. tinyurl.com/6dyoso
John D. Cook

Ái chà! Cảm ơn vì tiền hỗ trợ; Tôi không thể chờ đợi để dùng thử
yalestar

6

Nếu bạn thích shell scripting, bạn sẽ thích PowerShell!

Bắt đầu tại Chuyến tham quan có hướng dẫn của Microsoft Command Shell (Ars Technica).


8
Tôi thích kịch bản shell và tôi chấp nhận PowerShell. Đó là các lệnh và cú pháp rất tàn bạo. Các lệnh tùy chọn dài khủng khiếp mà không có bất kỳ lệnh hoàn thành hữu ích nào. Hoặc nếu có tôi đã không tìm thấy nó. Quá nhiều tính năng được nhồi nhét vào các lệnh đơn lẻ nên được tách ra. Biến lạ và cú pháp thoát chỉ một lập trình viên DOS có thể yêu thích.
Zan Lynx

8
@Zan Lynx - Bạn nói đúng về việc không tìm thấy công cụ. Tất cả các lệnh đều có bí danh và nhiều trong số chúng khớp với cả hai lệnh DOS và UNIX (ps, dir, rm, ls, kill, history, man, cat, Clear, v.v.) Các tên dài để chúng có một tên có ý nghĩa. Tuyệt vời cho các kịch bản - nó giúp khi một người mới phải sử dụng và duy trì nó. Có mở rộng tab cho lệnh ghép ngắn, hàm, biến, đường dẫn, tham số, v.v ... Phần lớn cú pháp là từ shell Unix và bạn đang nói về cú pháp thoát nào? `` không được sử dụng để thoát vì nó là dấu phân cách đường dẫn trong Windows.
manojlds

3
@Zan Lynx - Đối số của bạn không hợp lệ. Để dừng diễn giải các biến, sử dụng '(dấu ngoặc đơn). Để đôi dấu ngoặc kép điều - cùng, sử dụng write-output 'this is a "test"'. Câu hỏi mà bạn đang hướng đến là dành cho Regex và việc thoát cho regex có giá trị ở mọi nơi. Powershell cũng có chuỗi Here-String / verbatim. Ngay cả Java cũng không có những thứ này! Hãy thử thoát regex trong Java. Và đôi khi bạn không sử dụng nghĩa đen. Bạn sử dụng khi bạn cần. LiteralPath xử lý các ký tự đại diện nguyên văn và không mở rộng chúng. Bạn sử dụng nó khi tập tin của bạn có nó. Nó cung cấp cho bạn nhiều lựa chọn hơn.
manojlds

3
@manojlds: So với bash shell, Powershell chứa đầy những mâu thuẫn không có ý nghĩa và chỉ gây nhầm lẫn. Trong bash, bạn sử dụng cùng một ký tự thoát ở mọi nơi và các đường dẫn tệp được thoát giống như các chuỗi. Bạn không cần một tham số đặc biệt cho nó. Nếu bạn mở rộng một biến có các ký tự đặc biệt trong đó, bạn đặt nó trong dấu ngoặc kép và nội dung được an toàn, không cần phải gọi một hàm để thoát lại nó.
Zan Lynx

5
@Zan Lynx - Không có mâu thuẫn. Thậm chí write-output "this is a `"test`""hoạt động. Chỉ cần sử dụng `thay vì `\`. regex :: esc tồn tại để giúp bạn để bạn không bỏ lỡ công cụ thoát. Không cần thiết phải sử dụng nó. Bạn đang nghĩ rằng các tùy chọn bổ sung có sẵn để giúp bạn và ngăn ngừa sai lầm là không nhất quán.
manojlds

6

Vì các thử nghiệm gần đây của tôi đã đưa tôi vào chiều sâu của các cuộc gọi PowerShell và .NET, tôi phải nói rằng PowerShell có thể thay thế Cygwin và Unix shell.

Tôi không chắc chắn về Perl, nhưng vì cả PowerShell và Perl đều hoàn thành Turing như ngôn ngữ lập trình, nên tôi cũng đồng ý thay thế Perl.

Một điều mà PowerShell có trên Cygwin và Bash thông thường trong * nix, là khả năng thực hiện các cuộc gọi DLL được sandbox, thao tác hệ điều hành thông qua các cuộc gọi API trực tiếp, phương thức WMI và thậm chí cả các đối tượng COM. Làm thế nào về việc khởi chạy Internet Explorer thông qua mã, sau đó làm bất cứ điều gì bạn muốn với tài liệu được hiển thị của nó, mô phỏng hiệu quả một back-end cho máy chủ Web?

Làm thế nào về việc thu thập dữ liệu từ các máy chủ SQL và các nhà cung cấp dữ liệu khác, phân tích chúng và xuất dưới dạng CSV, tin nhắn thư, văn bản và thực sự là bất kỳ loại định dạng tệp hiện có và không tồn tại? (Tất nhiên, với các kỹ năng thích hợp để tạo một tệp hợp lệ từ dữ liệu nhận được, nhưng CSV có sẵn).

Và có một bảo mật bổ sung có sẵn thông qua các lệnh ghép ngắn và tập lệnh, chính sách nhóm và chính sách thực thi giúp ngăn chặn mã độc chạy trên hệ thống của bạn ngay cả khi bạn chạy chúng với tư cách quản trị viên.

Về những lệnh nào được triển khai - câu trả lời của Richard liệt kê chúng và khả năng mô phỏng chức năng của PowerShell.

Về việc PowerShell có mạnh mẽ để đảm bảo chuyển đổi hay không - đây là vấn đề sở thích cá nhân, mặc dù ngày càng có nhiều dịch vụ Windows cung cấp lệnh ghép ngắn PowerShell để kiểm soát chúng, việc không sử dụng PowerShell với các dịch vụ này hiện tại được coi là trở ngại. (Máy chủ Hyper-V là dịch vụ chính như vậy và nó cũng cung cấp khả năng làm được nhiều hơn với các lệnh ghép ngắn PowerShell so với GUI!)

Có lẽ câu trả lời này đã trễ năm năm, nhưng vẫn vậy, nếu ai đó thực hiện các tác vụ quản trị hoặc viết kịch bản chung cho nhiều thứ khác nhau trên Windows, họ chắc chắn nên thử khai thác PowerShell cho mục đích của mình.


6

Khi bạn so sánh PowerShell với tổ hợp Cygwin / Perl / Shell, hãy lưu ý rằng PowerShell chỉ đại diện cho phần "Shell" của kết hợp đó.

Tuy nhiên, bạn có thể gọi bất kỳ lệnh nào từ PowerShell giống như bạn thực hiện từ cmd.exe hoặc Cygwin. Nó không thực hiện lại các chức năng được chỉ định và chắc chắn nó không thể so sánh với Perl.

Đó là "vỏ", nhưng nó giúp lập trình dễ dàng hơn khi cung cấp giao diện thoải mái cho vũ trụ .NET.

Ngoài ra, hãy nhớ rằng PowerShell yêu cầu Windows XP, Windows Server 2003 trở lên, điều này có thể gây ra sự cố tùy thuộc vào cơ sở hạ tầng CNTT của bạn.

Cập nhật:

Tôi không biết cuộc tranh luận triết học nào mà câu trả lời của tôi sẽ nổ ra.

Tôi đã đăng câu trả lời của mình trong ngữ cảnh của câu hỏi: So sánh PowerShell với Cygwin và Perl và Bash.

PowerShell là một shell, vì nó không tạo ra sự khác biệt về cú pháp giữa các lệnh tích hợp, các lệnh, hàm người dùng và các lệnh bên ngoài (.exe, .bat, .cmd). Chỉ gọi các phương thức .NET khác nhau bằng cách thêm một không gian tên hoặc một đối tượng trong cuộc gọi.

Khả năng lập trình của nó xuất phát từ khung .NET, không phải từ bất kỳ thứ gì cụ thể đối với "ngôn ngữ" PowerShell.

Tôi muốn nói rằng tôi tin rằng PowerShell là một "ngôn ngữ kịch bản" ngay khi Bugzilla hoặc MediaWiki được triển khai dưới dạng các tập lệnh PowerShell chạy trên máy chủ web;)

Cho đến lúc đó, hãy tận hưởng sự so sánh .


Vâng, tôi đoán khi tôi nói về Unix "shell", tôi cũng đang đề cập đến tất cả các tiện ích thông thường đi kèm với Unix, chẳng hạn như grep, awk, v.v. Tôi chỉ tự hỏi liệu PowerShell có cung cấp các tiện ích tương tự ngoài -cái hộp.
Andy White

3
Powershell không "chỉ là một cái vỏ". Nó là một ngôn ngữ kịch bản. Tôi tự hỏi theo cách nào nó không thể so sánh với perl? Tôi thừa nhận rằng nó không chín chắn, nhưng hơn thế nữa tôi không thấy sự chênh lệch.
EBGreen

@EBGreen, chính xác ý bạn là gì với bình luận này? Tôi đồng ý rằng mọi ngôn ngữ shell hoặc script đều tương tự nhau, nhưng tôi đã tự hỏi nhiều hơn về các khả năng cụ thể của PowerShell so với bash / perl / các ngôn ngữ shell / ngôn ngữ script khác.
Andy White

2
Powershell có một loạt các chức năng vô cùng rộng lớn. Đó là - Một vỏ tương tác, có thể ghép lại - Một ngôn ngữ kịch bản tương tác phong phú - Một ngôn ngữ lập trình Nó cũng có một tập hợp các hàm tiện ích OO & tesxt phong phú (nghĩa là tương đương với grep / awk / etc).
Jeffrey Snover - MSFT

1
@Andy - Tôi hiểu Devio khi nói rằng powershell không mạnh bằng Perl. Tôi không tin đó là sự thật và tôi chỉ tự hỏi tại sao anh ta nghĩ đó là trường hợp.
EBGreen

4

Các lệnh ghép ngắn trong PowerShell rất đẹp và hoạt động đáng tin cậy. Tính hướng đối tượng của chúng hấp dẫn tôi rất nhiều vì tôi là nhà phát triển Java / C #, nhưng nó hoàn toàn không phải là một bộ hoàn chỉnh. Vì hướng đối tượng, nó đã bỏ lỡ rất nhiều sự trưởng thành của luồng văn bản của bộ công cụ POSIX ( awksed đặt tên cho một số).

Câu trả lời tốt nhất mà tôi đã tìm thấy trong tình thế tiến thoái lưỡng nan khi yêu các kỹ thuật OO và yêu sự trưởng thành trong các công cụ POSIX là sử dụng cả hai! Một khía cạnh tuyệt vời của PowerShell là nó thực hiện một công việc tuyệt vời để chuyển các đối tượng đến các luồng tiêu chuẩn. PowerShell theo mặc định sử dụng một đường ống đối tượng để vận chuyển các đối tượng của nó xung quanh. Đây không phải là luồng tiêu chuẩn (tiêu chuẩn ra, lỗi tiêu chuẩn và tiêu chuẩn trong). Khi PowerShell cần chuyển đầu ra cho một quy trình chuẩn không có đường ống đối tượng, trước tiên, nó sẽ chuyển đổi các đối tượng thành luồng văn bản. Vì nó làm điều này rất tốt, PowerShell là nơi tuyệt vời để lưu trữ các công cụ POSIX!

Bộ công cụ POSIX tốt nhất là GnuWin32 . Phải mất hơn 5 giây để cài đặt, nhưng nó đáng để xử lý và theo như tôi có thể nói, nó không sửa đổi hệ thống của bạn (đăng ký,c:\windows\* thư mục, v.v.) ngoại trừ sao chép tệp vào thư mục bạn chỉ định. Điều này là rất tốt vì nếu bạn đặt các công cụ trong một thư mục chia sẻ, nhiều người có thể truy cập chúng đồng thời.

Hướng dẫn cài đặt GnuWin32

Tải xuống và thực thi exe (từ trang SourceForge ) chỉ nó vào một thư mục phù hợp (tôi sẽ sử dụng C:\bin). Nó sẽ tạo một GetGnuWin32thư mục mà bạn sẽ chạy download.bat, sau đó install.bat(không có tham số), sau đó, sẽ có một C:\bin\GetGnuWin32\gnuwin32\binthư mục là thư mục hữu ích nhất từng tồn tại trên máy Windows. Thêm thư mục đó vào đường dẫn của bạn và bạn đã sẵn sàng để đi.


4

TL; DR - Tôi không ghét Windows hoặc PowerShell. Tôi không thể làm bất cứ điều gì trong Windows hoặc trên PowerShell.


Cá nhân tôi vẫn thấy PowerShell áp đảo tốt nhất.

  • tab hoàn thành các đường dẫn thư mục không kết hợp, yêu cầu người dùng nhập dấu phân cách đường dẫn sau mỗi lần hoàn thành tên.
  • Tôi vẫn cảm thấy như Windows thậm chí không có khái niệm về một con đường hay những gì một con đường là, không có người sử dụng truy cập chỉ nhà ~/ngắn của một số@environment://somejibberish/%user_home%
  • NTFS vẫn là một mớ hỗn độn và dường như sẽ luôn như vậy. Chúc may mắn điều hướng.

  • Giao diện cmd-esque, cmd.exe khủng long vẫn hiển thị trong PowerShell, Chỉnh sửaĐánh dấu vẫn là cách duy nhất để sao chép thông tin và chỉ sao chép dưới dạng khối hình chữ nhật của không gian đầu cuối có thể nhìn thấy. và Chỉnh sửaĐánh dấu vẫn là cách duy nhất để dán chuỗi vào thiết bị đầu cuối.

  • Vẽ nó màu xanh không làm cho nó hấp dẫn hơn. Tôi không ngại các nhà phát triển Microsoft có một hương vị màu sắc mặc dù.

  • Windows luôn mở ở góc trên cùng bên trái của màn hình. Đối với ai đó sử dụng các thanh tác vụ dọc, điều này cực kỳ khó chịu, đặc biệt khi xem xét rằng thanh tác vụ Windows sẽ bao phủ góc duy nhất của cửa sổ cho phép truy cập vào chức năng sao chép / dán.

Tôi không thể nói nhiều với lý do các công cụ Windows bao gồm. Vì có một bộ công cụ CLI mã nguồn mở, được cấp phép tự do và các tàu PowerShell, theo hiểu biết của tôi, không ai trong số chúng là một sự thất vọng hoàn toàn.

  • PowerShell wgetđưa các đối số dường như không thể so sánh được với wget GNU. Cảm ơn, tia hy vọng thoáng qua - vô dụng.
  • PowerShell POSIX không tương thích với Bash, đặc biệt là &&toán tử không được xử lý, làm cho lệnh đơn giản nhất có điều kiện theo sau không phải là một điều.

Tôi không biết người đàn ông; Tôi đã cho nó một shot, tôi thực sự đã làm; Tôi vẫn cố gắng cho nó một phát súng với hy vọng rằng lần sau khi tôi mở nó, nó sẽ trở nên vô dụng hơn. Tôi không thể làm bất cứ điều gì trong PowerShell và tôi hầu như không thể làm mọi thứ với một dự án thực sự để đưa các công cụ GNU vào Windows.

MySysGit cung cấp cho tôi lời nhắc cmd.exe khủng long với một vài công cụ GNU và nó vẫn còn rất ít, nhưng ở lần hoàn thành đường dẫn cuối cùng hoạt động. Và lệnh Git sẽ chạy trong Git Bash.

Mintty for MySysGit cung cấp giao diện Cygwin trên môi trường của mysysgit, tạo bản sao và dán một thứ (chọn để sao chép (chuột), Shift+ Insđể dán, cách hiện đại ...). Tuy nhiên, những thứ như git pushbị phá vỡ trong Mintty.

Tôi không có ý muốn nói, nhưng tôi vẫn thấy những vấn đề lớn với khả năng sử dụng dòng lệnh trên Windows ngay cả khi có các công cụ như Cygwin.


PS: Chỉ vì một cái gì đó có thể được thực hiện trong PowerShell, không làm cho nó có thể sử dụng được . Khả năng sử dụng sâu hơn khả năng và là những gì tôi có xu hướng tập trung vào khi cố gắng sử dụng sản phẩm như một người tiêu dùng.


Bật chế độ QuickEdit? Chọn và nhấn enter để sao chép, ctrl-v để dán, không còn Chỉnh sửa-> Đánh dấu hoặc Chỉnh sửa-> Dán. Trong khi ở tùy chọn, đặt vị trí Cửa sổ và bỏ chọn "cho phép cửa sổ vị trí hệ thống". Hoàn thành tab không chỉ là hoàn thành các đường dẫn hệ thống tập tin, nó còn hoàn thành các tên biến, tên lệnh, thuộc tính đối tượng, bạn có thể sắp nhập .hoặc [truy cập vào một thuộc tính hoặc chỉ mục, vì vậy cuối cùng nó không thể thêm dấu phân cách đường dẫn. Chính xác thì PowerShell wget? POSIX PowerShell nào? Đó không phải là cố gắng mang các công cụ gnu lên Windows, hoặc là btw tương thích bash.
TessellatingHeckler

Vâng tôi biết nó không cố gắng để được bash. Tôi đã kiềm chế không nói như vậy trong bài viết gốc. Tôi sẽ nói rằng w nào nhận được nhị phân nhưng không có lệnh "which" nào trong shell power :( tôi không nhớ nơi mua tôi đọc power Shell được cho là tương thích POSIX
ThorSummoner

5
lại: "không mà" -> (get-command wg*.exe).Path. Re: bash hoàn thành và readline -> leeholmes.com/blog/2012/09/13/ nam dẫn đến github.com/lzybkr/PSReadLine
TessellatingHeckler

2

Tôi chưa thấy PowerShell đã thực sự cất cánh, ít nhất là chưa. Vì vậy, nó có thể không xứng đáng với nỗ lực học nó trừ khi những người khác trong nhóm của bạn đã biết điều đó.

Đối với tình huống khó khăn của bạn, bạn có thể tốt hơn với một ngôn ngữ kịch bản mà người khác có thể hiểu được, Perl như bạn đã đề cập hoặc những người khác như Ruby hoặc Python.

Tôi nghĩ rằng rất nhiều trong số đó phụ thuộc vào những gì bạn cần làm. Cá nhân tôi đã sử dụng Python cho các tập lệnh cá nhân của riêng tôi, nhưng tôi biết khi tôi bắt đầu viết một cái gì đó mà tôi sẽ không bao giờ có thể vượt qua nó - vì vậy tôi cố gắng không làm bất cứ điều gì quá cách mạng.


2

Tại sao không sử dụng cả hai? Gọi các tập lệnh PowerShell trong Cygwin giống như bất kỳ tập lệnh được giải thích nào khác như Perl, v.v.

Tôi làm điều này đủ đến mức tôi đã viết https://bitbucket.org/jbianchi/powershell cho một trình bao bọc Bash để gọi powershell.exe trong Cygwin. Nó có thể được sử dụng như một shebang như là dòng đầu tiên của tập lệnh powershell.exe .ps1 (vì PowerShell cũng sử dụng "#" làm nhận xét). Xem https://bitbucket.org/jbianchi/powershell/wiki/Home để biết ví dụ


1

Trong một vài dòng, Cygwin và PowerShell là các công cụ khác nhau, tuy nhiên nếu bạn đã cài đặt Cygwin, bạn có thể chạy các tệp thực thi Cygwin trong phiên PowerShell. Tôi đã quen với PowerShell đến nỗi bây giờ tôi không còn sử dụng grep, sort, awk, v.v. Có rất nhiều lựa chọn thay thế tích hợp trong PowerShell, và nếu không bạn có thể tìm thấy một lệnh ghép ngắn ngoài đó.

Công cụ chính tôi thấy mình đang sử dụng là ssh.exe, nhưng trong phiên PowerShell.

Nó hoạt động rất tốt.


0

Tôi thấy lập trình PowerShell không đáng để bỏ công sức.

Tôi có vài năm kinh nghiệm với kịch bản shell trong Unix, nhưng tôi thấy rất khó để làm bất cứ điều gì với PowerShell.

Có vẻ như nhiều chức năng yêu cầu bạn thẩm vấn Giao diện quản lý Windows và đưa ra các lệnh giống như SQL để có được thông tin bạn cần.

Ví dụ, tôi muốn viết một tập lệnh để xóa tất cả các tệp có hậu tố cụ thể khỏi cây thư mục. Trong Unix, đây sẽ là một ...

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

Sau một vài giờ dicking xung quanh với Scripting.FileSystemObjectWScript.Shellvà phát hành "SELECT * FROM Win32_ShortcutFile nơi ổ đĩa = '" & ổ & ' 'VÀ Path ='' & searchFolder & "'", tôi cuối cùng đã từ bỏ và giải quyết cho Windows Explorer kiếm lệnh và chỉ cần làm bằng tay Có lẽ có một số cách để làm những gì tôi muốn, nhưng tôi không thấy bất cứ điều gì rõ ràng và tất cả các ví dụ trên trang web MSDN đều tầm thường đến mức vô dụng.

EDIT Heh, tất nhiên ngay khi tôi viết bài này, tôi đã tìm hiểu thêm và thấy những gì tôi đã thiếu: -recursetùy chọn cho lệnh remove-item bị lỗi (tiết lộ nếu bạn sử dụng get-help remove-item -detailed).

Tôi đã thử "remove-item -filter '* .xyz' -recurse" và nó không hoạt động, vì vậy tôi đã từ bỏ nó.

Hóa ra bạn cần sử dụng get-childitem -filter '*.xyz' -recurse | remove-item


16
Tôi nghĩ rằng bạn đang nhầm lẫn Windows Scripting Host (WSH) với PowerShell. Chúng hoàn toàn khác nhau.
Erik Funkenbusch

3
Ví dụ: nếu bạn muốn xóa tất cả các tệp kết thúc bằng .TMN, bạn có thể ban hành lệnh này get-childitem c: \ -include * .TMN -recurse | foreach ($ _) {remove-item $ _. fullname}
Erik Funkenbusch

@Mystere: Tôi đã thử cái này và nó dường như không hoạt động. Sau một vài lần vất vả, có vẻ như * .tmn là thứ bạn cần (thay vì chỉ .tmn)
redtuna

5
Tôi không thể tôn trọng nhiều hơn, và tôi không phải là một người Windows. Tôi thấy PS dễ viết kịch bản hơn bash. PS phù hợp hơn. Với Bash, bất kỳ tiện ích bàn điều khiển nào bạn gọi đều có cú pháp riêng và hành vi duy nhất và chính cú pháp bash khá khó hiểu. PS mạnh mẽ hơn nhiều với các tính năng ngôn ngữ như chức năng ẩn danh, (tập lệnh), xác thực tham số, chức năng nâng cao, v.v. Cộng với khái niệm mô-đun cho tính di động và nhiều tính năng khác. Chủ yếu mặc dù, lý do lớn nhất là những gì bạn luôn nghe về PS, đối tượng át chủ đề. Bash vẫn nhanh hơn mặc dù.
dùng2233949


0

PowerShell rất mạnh, mạnh hơn so với các bản dựng sẵn của shell Unix (nhưng chỉ vì nó bao gồm phần lớn các chức năng thường được trình bày theo chương trình con). Ngoài ra, hãy cân nhắc rằng bạn có thể viết các applet bằng bất kỳ ngôn ngữ .NET nào, bao gồm IronPython , IronRuby , PerlNet, v.v. hoặc bạn có thể chỉ cần gọi các lệnh Cygwin của mình từ PowerShell, bỏ qua tất cả các chức năng bổ sung và nó sẽ hoạt động tương tự như Bash, KornShell , hay bất cứ cái gì...


Tôi nghĩ rằng bạn có thể đang thiếu các mục tiêu thiết kế của shell Unix. Không gõ PowerShell (muốn tự tìm hiểu thêm) nhưng bạn cần hiểu công cụ Unix để đưa ra tuyên bố như vậy.
Jé Queue

2
@Xepoch - Không, tôi nghĩ bạn đang thiếu các mục tiêu thiết kế của PowerShell. PowerShell có thể làm mọi thứ mà hệ vỏ Unix có thể làm giống như cách họ làm. Tuy nhiên, sức mạnh thực sự đến khi bạn sử dụng hệ thống đường ống đối tượng của PS thay vì chỉ phân tích cú pháp đầu ra văn bản. Vì vậy, PowerShell có thể làm chính xác những gì bash hoặc korn có thể làm, nhưng họ không thể làm những gì PowerShell có thể làm.
Erik Funkenbusch

3
Tôi chỉ đơn giản là không biết PowerShell đủ để đưa ra lời phê bình cho bạn, nhưng như bạn biết rõ mục tiêu của hệ vỏ Unix không nhất thiết phải là sự thay thế hoàn toàn cho công cụ bên ngoài, thay vào đó là các cấu trúc điều khiển xung quanh nó. Một lần nữa, tôi không thể so sánh cũng không tương phản nhưng nâng cao PowerShell vì nó có nhiều phần mềm tích hợp hơn không nhất thiết là lợi ích của hệ vỏ Unix.
Jé Queue

@Xepoch - Vấn đề là, bạn có thể chọn cách bạn muốn làm điều đó. Bạn có thể sử dụng tất cả sự tốt đẹp của vỏ tích hợp hoặc bạn có thể bỏ qua và thực hiện theo cách mà Unix thực hiện. Đó là lựa chọn của bạn. Và lựa chọn là tốt, phải không?
Erik Funkenbusch
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.