unix - win10 - windows terminal




PowerShell是否準備好替換Windows上的Cygwin shell? (12)

grep的

Select-String cmdlet和-match運算符使用正則表達式工作。 你也可以直接使用.NET的regex支持來獲得更高級的功能。

分類

Sort-Object更強大(比我記得* nix的sort )。 允許對任意表達式進行多級排序。 在這裡,PSH對底層類型的維護有所幫助; 例如DateTime屬性將被排序為DateTime而不必確保格式化為可排序的格式。

uniq的

Select-Object -Unique

Perl(PowerShell與Perl功能有多近?)

就Perl特定領域支持庫的廣度而言:無處不在(尚未)。

對於一般編程,PSH肯定更加緊密和一致,並且更容易擴展。 文本消除的一個缺口與perl的操作符相當。

AWK

自從使用awk(必須大於18年,因為後來我只是使用perl)已經足夠長了,所以無法真正發表評論。

SED

[往上看]

文件(提供文件信息的命令)

PSH在這裡的優勢並不在於它能夠處理文件系統對象(它在這裡獲得完整的信息, dir返回FileInfoFolderInfo對象)就是整個提供者模型。

您可以將註冊表,證書存儲區,SQL Server,IE的RSS緩存等作為與文件系統相同的cmdlet進行導航的對象空間。

PSH絕對是Windows上的前進方向。 MS已經使其成為未來非家用產品的一部分要求。 因此,在Exchange中支持豐富的支持,這只會擴展。

最近的一個例子是TFS PowerToys。 許多TFS客戶端操作都是在不必每次啟動tf.exe的情況下完成的(這需要新的TFS服務器連接等),並且明顯更容易進一步處理數據。 以及允許廣泛訪問整個TFS客戶端API的細節比在TF.exe的團隊資源管理器中公開的更詳細。

我在辯論是否應該學習PowerShell,或者只是堅持使用Cygwin / Perl腳本/ Unix shell腳本等。

PowerShell的好處在於,沒有Cygwin的隊友可以更輕鬆地使用這些腳本; 但是,我不知道我是否真的在寫這麼多通用腳本,或者甚至人們會使用它們。

Unix腳本非常強大,PowerShell足夠接近以保證切換?

以下是我在PowerShell中查找的一些特定事物(或等價物):

  • grep
  • 分類
  • uniq的
  • Perl(PowerShell與Perl的功能有多近?)
  • AWK
  • sed
  • 文件(提供文件信息的命令)
  • 等等

PowerShell中的cmdlet非常好,可靠地工作。 由於我是一名java / C#開發人員,因此他們面向對象的特性非常吸引我,但它根本不是一個完整的集合。 由於它是面向對象的,所以錯過了很多POSIX工具集的文本流成熟度( awksed等等)。

我發現,愛好面向對象技術和愛上POSIX工具的成熟性的最佳答案是同時使用! Powershell的一個重要方面是,它能夠很好地將對像傳送給標準流。 Powershell默認使用對像管道來傳輸其對象。 這些不是標準流(標準輸出,標準錯誤和標準輸入)。 當Powershell需要將輸出傳遞給沒有對像管道的標准進程時,它首先將對象轉換為文本流。 由於它做得非常好,Powershell成為了託管POSIX工具的絕佳場所!

最好的POSIX工具集是GnuWin32 。 它的確需要5秒以上的安裝時間,但這是值得的,據我所知,它不會修改您的系統(註冊表, c:\windows\*文件夾等),除了將文件複製到你指定的目錄。 這非常好,因為如果你把這些工具放在一個共享目錄中,很多人可以同時訪問它們。

GnuWin32安裝說明

下載並執行GnuWin32 (它來自SourceForge站點 ),將它指向一個合適的目錄(我將使用c:\bin )。 它將創建一個GetGnuWin32目錄,在該目錄中將運行download.bat ,然後install.bat (不帶參數),之後將會有一個c:\bin\GetGnuWin32\gnuwin32\bin目錄,它是最有用的文件夾曾經存在於Windows機器上。 將該目錄添加到您的路徑中,然後就可以開始了。


TL; DR - 我不討厭Windows或Powershell,我只是無法在Windows或PowerShell中任何事情。

我個人仍然覺得powershell充其量是最好的。

  • 目錄路徑的選項卡完成不會混合,要求用戶在每個名稱完成後輸入路徑分隔符。
  • 我仍然覺得窗戶甚至沒有路徑或路徑的概念,沒有可訪問的用戶家庭指示符~/缺少一些@environment://somejibberish/%user_home%
  • NTFS仍然是一團糟,似乎永遠都會是,祝你好運。

  • cmd-esque界面,恐龍cmd.exe在Powershell中仍然可見, edit->mark仍然是複制信息的唯一方法,並且只能以可見終端空間的矩形塊的形式進行複制。 並edit->paste仍然是將字符串粘貼到終端的唯一方法。

  • 將它塗成藍色並不會讓它變得更具吸引力。 我不介意MS開發人員嘗試著色。

  • Windows總是在屏幕的左上角打開,對於使用垂直任務欄的人來說,這是令人難以置信的煩惱,特別是考慮到Windows任務欄將覆蓋窗口的唯一角落,以便訪問複製/粘貼功能。

我無法說出太多的工具窗口包括的理由。 因為有一整套開放源代碼,免費許可的cli工具,並且據我所知,powershell包含在內,但它們都不是完全令人失望。

  • powershell wget對gnu wget提出了看似無與倫比的理由,感謝一線希望無限的希望。
  • powershell posix不是bash兼容的,特別是&&操作符不被處理,使得最簡單的條件命令不是一件事情。

我不知道男人,我給了它一個鏡頭,我真的做到了; 我仍然試圖在下一次打開它的希望中給它一個機會,它將毫無用處。 我無法在PowerShell中做任何事情,並且我可以忍受做一個真正的項目來把gnu工具帶到Windows上。

MySysGit為我提供了dinosur cmd.exe提示符,它提供了幾個gnu工具,但仍然非常令人滿意,但是最後的路徑完成工作。 而git命令將在gitBash中運行

Mintty for MySysGit通過mysysgit的環境提供Cygwin接口,進行複制和粘貼。 (選擇複製(鼠標), 移動 +粘貼,多麼現代......)但是,像git push東西在Mintty中被打破。

我並不是要咆哮,但即使有像Cygwin這樣的工具,我仍然在Windows上看到命令行可用性方面的巨大問題。

PS只是可以在PowerShell中完成某些功能 ,不會使其可用 ,可用性比功能更深,而且當我嘗試將產品用作消費者時,我傾向於關注它。


I found PowerShell programming to be not worth the effort.

I have several years of experience with shell scripting under Unix, but I found it enormously difficult to do much of anything with PowerShell.

It seems like many functions require you to interrogate the Windows Management Interface and issue SQL-like commands to get the information you need.

For example, I wanted to write a script to remove all files with a specific suffix from a directory tree. Under Unix, this would be a simple ...

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

After a couple of hours dicking around with Scripting.FileSystemObject and WScript.Shell and issuing "SELECT * FROM Win32_ShortcutFile WHERE Drive = '" & drive & "' AND Path = '" & searchFolder & "'", I finally gave up and settled for Windows Explorer's Search command and just do it manually. There's probably some way to do what I wanted, but I didn't see anything obvious and all the examples on the MSDN site were so trivial as to be worthless.

EDIT Heh, of course as soon as I wrote this I poked around some more and found what I had been missing: the -recurse option to the remove-item command is faulty (revealed if you use get-help remove-item -detailed ).

I had been trying "remove-item -filter '* .xyz' -recurse" and it wasn't working, so I gave up on it.

Turns out you need to use get-childitem -filter '*.xyz' -recurse | remove-item



作為一名職業生涯專注於Windows企業開發的人員,從1997年到2010年,顯而易見的答案是Powershell出於上述所有良好理由(例如,它是MS的企業戰略的一部分;它與Windows / COM / .NET很好地集成;以及使用對象而不是文件提供了“更豐富”的編碼模型)。 出於這個原因,我在過去2年左右一直在使用和推廣Powershell,並明確表示我遵循“比爾之語”。

然而,作為一名實用主義者,我不再確定Powershell是一個很好的答案。 儘管它是一個出色的Windows工具,並且為填補Window命令行中的歷史性漏洞提供了一個非常需要的步驟,因為我們都在觀察MS對消費計算漏洞的控制,因此MS似乎越來越有可能會進行大規模的戰鬥以保持其操作系統這對未來的企業來說非常重要。

事實上,鑑於我發現我的工作越來越多地處於異構環境中,我發現現在使用bash腳本更有用,因為它們不僅可以在Linux,Solaris和Mac OS X上工作,還可以與在Windows上的Cygwin的幫助。

因此,如果您認為操作系統的未來是商品化的而不是壟斷的話,那麼選擇敏捷的開發工具策略,在可行的情況下遠離專有工具似乎是有意義的。 但是,如果你看到你的未來被所有那是雷德蒙德統治的話,那就去Powershell吧。


工具只是工具。
他們幫助或者他們不幫助。
你需要幫助,否則你不需要幫助。

如果您了解Unix並且這些工具可以在Windows上完成您所需要的工作 - 那麼您就是一個快樂的人,並且不需要學習PowerShell(除非您想探索)。

我最初的意圖是在Windows中包含一套Unix工具,並用它來完成(我們團隊中的許多人擁有深厚的Unix背景和對該社區的尊重。)我發現的是,這沒有真的幫助很大。 原因是awk / grep / sed不能對付COM,WMI,ADSI,註冊表,證書庫等等。換句話說,UNIX是一個圍繞文本文件進行自我調整的整個生態系統。 因此,文本處理工具是有效的管理工具。 Windows是一個完全不同的生態系統,圍繞API和對象進行自我調整。 這就是我們發明PowerShell的原因。

我認為你會發現,當文本處理不能在Windows上獲得你想要的東西時,會有很多場合。 那時候,你會想要拿起PowerShell。 注 - 這不是一個全部或沒有處理。 在PowerShell中,您可以調用Unix工具(並使用其文本處理或PowerShell的文本處理)。 您也可以從Unix工具調用PowerShell並獲取文本。

再次 - 這裡沒有宗教信仰 - 我們的重點是為您提供成功所需的工具。 這就是為什麼我們對反饋如此熱情。 讓我們知道我們在工作中失敗的位置,或者您沒有所需工具的地方,我們會將其列入清單並加以解決。 坦率地說,我們正在挖掘一個30年的洞,因此需要一段時間。 也就是說,如果您選擇Windows Server 2008 / R2的測試版和/或我們服務器產品的測試版,我認為您會對該漏洞的填補速度感到震驚。

關於使用情況 - 我們已經有至少350萬次下載。 這不包括在Windows Server 2008中使用它的人,因為它作為可選組件包含在內,不需要下載。 V2將在所有版本的Windows中發布。 除了Server Core之外的所有版本,它都是默認開啟的,它是一個可選組件。 在Windows 7 / Windows Server 2008 R2發布後不久,我們將在所有平台XP和更高版本上提供V2。 換句話說 - 您的學習投資將適用於大量的機器/環境。

最後一條評論。 如果/當你開始學習PowerShell時,我認為你會很開心。 很多設計都受到我們的Unix背景的嚴重影響,所以雖然我們有很大的不同,但是你會很快找到它(在你過度詛咒它不是Unix之後:-))。 我們知道人們對學習的預算非常有限 - 這就是為什麼我們在一致性方面超強的核心。 你會學到一些東西,然後你會反複使用它。

實驗! 請享用! 從事!


很多偉大的答案,這裡是我的看法。 PS已經準備就緒,如果你是...例如

grep =“ Select-String -Pattern

sort = "Sort-Object"

uniq =“ Get-Unique

file =“ Get-Item

cat =“ Get-Content

Perl / Awk / Sed不是命令,但實用程序因此難以比較,但您幾乎可以在Powershell中執行所有操作。


我最近才開始以任何嚴肅的態度涉足PS 。 雖然在過去的七年中,我一直在幾乎完全基於Windows的環境中工作,但我來自Unix背景,發現自己經常試圖在Windows上“交流”我的交互體驗。 至少可以說是令人沮喪的。

PSBashtcshzsh等東西進行比較是公平的,因為像grepsedawkfind等實用程序嚴格來說不是shell的一部分; 但是,它們總是會成為任何Unix環境的一部分。 也就是說,像Select-String這樣的PS命令與grep具有非常類似的功能,並且作為PS中的核心模塊捆綁在一起...所以線條可能會有些模糊。

我認為關鍵的是文化 ,以及各自的工具集將體現各自的文化:

  • Unix是一種基於文件的文件 (通常是非Unicode) 基於文本的文化。 配置文件幾乎都是文本文件。 另一方面,Windows在配置格式方面總是更加結構化 - 配置通常保存在專用數據庫(例如Windows註冊表)中,這些數據庫需要專門的管理工具。
  • Unix管理(多年來,開發)接口傳統上是命令行和虛擬終端。 Windows最初是作為一種GUI開始的,而管理功能最近才開始脫離專門基於GUI的方式。 我們可以預期命令行上的Unix體驗將會更豐富,更成熟,因為它在PS上佔有重要地位,而且我的體驗與此相匹配。 就此而言,以我的經驗:

    • Unix管理經驗旨在使事情輕鬆完成最少量的擊鍵; 這可能是由於必須通過緩慢的9600波特率撥號連接管理服務器的歷史情況造成的。 現在PS確實有別名,它們可以很好地解決相當詳細的動詞 - 名詞標準,但是了解這些別名有點痛苦(任何人都知道比以下更好的東西: 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

      這意味著“執行先前的命令,但用51代替-1-50

    • Unix體驗針對觸摸打字員進行了優化; 一個人幾乎可以做任何事情而不會離開“家”的位置。 例如,在Bash中 ,使用Emacs密鑰綁定(是的,Bash也支持vi綁定),使用Ctrl-PCtrl-N完成歷史記錄的循環,同時移動到行的開始和結束時使用Ctrl- ACtrl-E ......並且它絕對不會在那裡結束。 即使在PS控制台中進行最簡單的導航,也無需從原始位置移開,而且遇到麻煩。

    • 簡單的東西,如Unix上的多功能分頁(ala less )在PS中似乎並不可用,這有點令人沮喪,而且豐富的編輯器體驗也不存在。 當然,可以隨時下載第三方工具來填補這些空白,但如果這些東西只是“存在”就好像它們具有任何Unix的味道一樣。
  • 至少在系統API方面,Windows文化主要由支持框架驅動,即COM.NET ,它們都是高度結構化和基於對象的。 另一方面,對Unix API的訪問傳統上是通過文件接口( /dev/proc )或(非面向對象的)C風格庫調用。 然後,腳本體驗與其各自的操作系統範例相匹配就不足為奇了。 PS本質上是結構化的(所有東西都是一個對象),而Bash和Friends是基於文件的。 PS程序員可以使用的結構化API非常廣泛(基本上與現有的標準COM和.NET接口集合相當)。

總之,雖然PS的腳本功能可以說比Bash更強大(特別是當您考慮.NET BCL的可用性時),但交互式體驗顯著變弱,特別是如果您是從完全由鍵盤驅動,基於控制台的視角(盡可能多的Unix主管)。


我無論如何都不是一個非常有經驗的PowerShell用戶,但是我接觸到的一點點讓我印象深刻。 您可以將內置cmdlet鏈接在一起,以完成任何可以在Unix提示符下執行的操作,還有一些額外的優點可用於執行導出到CSV,HTML表格和更深入的系統管理員類型工作。 如果你真的需要像sed這樣的東西,總是有UnixUtilsGnuWin32 ,你可以很容易地與Powershell集成。

作為一個長期使用Unix的用戶,我習慣使用命令命名方案時遇到了一些麻煩,如果我知道更多的.NET,我肯定會從中受益更多。

所以本質上說,如果Windows的唯一性不會造成問題,我認為非常值得學習。


正如我最近的實驗讓我深入了解Powershell和.NET的調用,我必須說Powershell 可以取代Cygwin和Unix shell。 我不確定Perl,但是因為Powershell和Perl都是Turing作為編程語言完成的,所以我認為這也是取代Perl的一個好方法。 Powershell在* nix下的Cygwin和普通bash之上的一件事是,它能夠執行沙盒DLL調用,通過直接的API調用操作系統,WMI方法甚至COM對象。 如何通過代碼啟動IE,然後根據顯示的文檔做任何你想做的事情,有效地模擬Web服務器的後端? 如何收集來自SQL服務器和其他數據提供者的數據,解析它們並導出為CSV,郵件,文本和實際上任何類型的現有和不存在的文件格式? (具有從接收到的數據中創建有效文件的適當技能,當然可以使用CSV)並且可以通過簽名的cmdlet和腳本,組策略和執行策略提供額外的安全性,以幫助防止惡意代碼在您的系統,即使您以管理員身份運行它們。

關於實現哪些命令 - Richard的答案列出了它們,Powershell已經能夠模擬它們的功能。

關於Powershell是否強大以保證切換 - 這更多是個人喜好的問題,儘管隨著越來越多的Windows服務提供Powershell cmdlet來控制它們,而不是使用Powershell來提供這些服務,這被認為是一個障礙。 (Hyper-V服務器是主要的此類服務,它還提供了使用Powershell cmdlet執行更多操作的功能,而不是使用GUI!)

可能這個答案遲了五年,但如果有人在Windows上執行管理任務或者各種常規腳本,他們肯定會嘗試利用Powershell來達到目的。






powershell