2011-02-09 165 views
12

我勝任C#程序員,並且是PowerShell的新手。我想知道,它有什麼好處?它更多是程序員的工具還是管理員?什麼是PowerShell的好處?

請分享你的經驗。使用.NET程序集編寫腳本比使用C#工具更容易?你用什麼真正的生產任務?

UPD:也許問題應該是「什麼是相比,C#沒有批」。

+0

的[你如何使用PowerShell可能重複? ](http://stackoverflow.com/questions/8722/how-do-you-use-powershell) – Helen

回答

5

編寫C#的工具,你通常需要建立一個Visual Studio項目(或其他IDE中的項目,或者如果你這個「手動」做,你至少需要構建腳本調用C#編譯器)。如果對於特定的任務來說這似乎是太多的開銷,並且您只需要一個簡單的單一文件源代碼和程序一體化解決方案,那麼PowerShell腳本可能是更好的選擇。

編輯:我做我的答案CW,所以任何人都可以在這裏添加一些原因,你可能更喜歡PowerShell腳本agains一個C#解決方案:

  • 你沒有的Visual Studio(或任何其他C#IDE),或者你根本不習慣(像很多系統管理員)
  • 該程序是如此之小,你不需要調試器,一些簡單的控制檯輸出將做到這一點
  • 你不想保留多個文件
  • 你不想爲你的工具單獨的配置參數到一個單獨的配置文件
  • 時,你可以定義個人的任務,但不能確定確切的工作流程,腳本的混合物和C#是理想的。在C#中創建cmdlet或提供程序可讓您的腳本以一般方式訪問任何內容,PowerShell將成爲粘合劑,使工作流程更靈活適應新的情況。
  • 你有幾個競爭的總體設計思想,你想快速測試可行性的可能性。 Powershell的軟打字和管道架構使得很容易忽略許多控制結構和類型細節的變幻莫測,併成爲算法的核心。
  • (...)在這裏補充
+0

謝謝,文檔。但啓動Visual Studio通常不成問題。調試C#比PowerShell更容易嗎? – zzandy

+1

這對你來說可能不是問題,但對於網絡管理員來說,這可能是一個真正的痛苦 - 隨着問題變得越來越小,開銷越來越大。 –

+1

你也可以調試PowerShell。該安裝隨附「Windows PowerShell ISE」,它是一個帶有調試功能的IDE。當然,它並不像Visual Studio那樣舒適,但足以調試PowerShell腳本。 –

2

Powershell是一個功能強大的工具,您可以使用它來完成若干不同的任務,否則這些任務將需要用戶使用鼠標......(不僅僅是)。

例如,MS服務器產品,如SQL服務器,Exchange,SharePoint和等最新版本曝光了一組豐富,可以很容易地使用PowerShell使用,在這種光線的API,使用PowerShell例如,您可以:

  • 在SQL Server中附加,分離,備份,恢復數據庫;
  • 操縱Exchange郵箱;
  • 等等。

所有事情你都不能在批處理文件之前完成。

+0

所以這對自動化很好嗎?但如何比較PowerShell的C#?如果在C#中編寫代碼不是問題,那麼PowerShell會提供哪些優勢? – zzandy

+0

沒有意義比較PowerShell與C#,我們是否比較命令提示符與Pascal?當你可以通過一個小的powershell腳本自動化某些東西時,你可以做到這一點,並且你不用擔心創建一個應用程序,windows或控制檯,可以構建,編譯和調試以獲得相同的結果。 –

2

它稍微多一個系統管理員工具,但只是稍微。

我會選擇PowerShell的過來,說的地方,C#是:

  • 任何你可能要運行一個外部應用程序
  • 任何你想要處理的自動化API ...
  • 任何你正在操作的文件

我們用它來自動化我們的隔夜驗收測試,編譯的結果,更新最新的和電子郵件有關團隊的網頁。

請注意,NuGet使用Powershell來自動添加/刪除軟件包到您的解決方案。 (並在此過程中公開一個PowerShell控制檯,讓您自動將Visual Studio自動化。)

加上以交互方式演變腳本的能力,而不是使用編譯語言編寫的 - >調試 - >修復週期,可以使它可以快速打開簡單的腳本。

7

當會更容易編寫使用比C# 工具.NET程序集一個 腳本?

啊,看,就是這樣。 PowerShell彌合了批處理文件和.NET世界之間的鴻溝。 PowerShell回答了這樣一個問題:「如果你要編寫一個具有.NET所有功能的新命令解釋器,它完全是動態的,並且幾乎包含了人們在命令shell中需要的大部分內容?」

那麼你什麼時候使用C#的PowerShell?對於集成或編排其他應用程序的小型應用程序來說,這更方便 - 因爲您不必編譯它,所以更方便,並且它已經有一種將數據傳遞到其他腳本和腳本的標準方式,這很容易人們(誰知道PowerShell)瞭解。

2

我已經創建了兩個純PowerShell命令行開關,並在C#中創建了一些。通常,我在C#中完成的更復雜,我發現使用類等構造多個文件更容易,以便更好地維護代碼。

它也更容易產生比較PowerShell的C#項目測試,C#在Visual Studio中的頭等公民,和PowerShell是不是。

在PowerShell中執行所有操作的優點是任何人都可以編輯腳本。

+0

+1爲'任何人都可以編輯你的腳本'。好的觀察。 – akauppi

+0

@akauppi謝謝:) –

2

更多的原因,我覺得它比C#的小東西,可能需要頻繁改變更好。大多數情況下,我將它用於構建和自動化部件。我更喜歡PowerShell的原因是,我的腳本幾乎總是需要Visual Studio的一些DLL。現在,如果它是一個C#應用程序,當Visual Studio的新版本出來時,我需要使用新引用重新編譯,然後將其發佈到需要的所有位置。但是,如果是powershell,我可以簡單地在腳本中更改dll的路徑,一切正常。另外,我發現使用文件解析和其他perl-ish類型工作更容易。

7

我是C#開發,並已使用PowerShell的公測以來天的時候它仍然被稱爲單子。我還在UNIX上進行了大量的開發,包括與Korn Shell進行自動化/腳本編寫。對我來說,PowerShell是天賜之物,因爲我厭倦了Korn Shell與Windows的小阻抗不匹配。例如,指定一個網絡共享路徑是特別嚴重的"\\\\\\server\\\\share" IIRC。這是一個有點猜謎遊戲,你有多少次逃避反斜槓取決於字符串得到評估的次數。

我使用PowerShell進行了大量的自動化任務,例如:

  • 通過在這裏我要搜索的文件的csproj內容的大源目錄Grepping。
  • 我曾用PowerShell腳本修改過260多個VCPROJ文件。
  • 另一次,我不得不創建一堆新的C#項目,每個項目都有相當數量的項目屬性進行配置,包括大量的代碼分析調整。我寫了一個腳本來獲取C#項目的股票文件,併爲我做了所有的調整。爲我省去了很多時間和更多的重要工作,爲我節省了很多錯誤和/或忘記設置了某些設置
  • TFS查詢(使用TFPT PowerShell cmdlet),例如在簽入註釋中搜索最近的變更集。
  • 刪除特定文件夾層次結構內的所有臨時文件(bin/obj dirs,suo文件等)。

要更換自定義命令行實用程序:

您可以使用PowerShell作爲一個偉大的方式來代替你以前寫的那些小的命令行工具。想想這個。 PowerShell是一種相當強大的腳本語言,可讓您訪問大多數.NET Framework。它特別擅長參數分析,即它具有一個內置的參數分析引擎,可爲您提供:命名參數,位置參數,可選參數,切換參數,管道綁定參數,參數驗證等。現在考慮典型的命令行工具中的多少代碼專用於參數解析與實際功能。我幾乎停止編寫命令行實用程序(除非它們特別複雜 - 那麼你無法擊敗VS調試器)。我讓PowerShell爲我處理所有參數解析。使用PowerShell 2.0,只需使用一些適當格式化的註釋來修飾腳本,就可以輕鬆地爲您的實用程序添加文檔/用法。

我也使用PowerShell作爲.NET REPL

  • 無需創建ConsoleApplication59只是爲了看看什麼是格式化字符串確實如我只是去我的PowerShell提示符,並嘗試像"{0,20:F1}" -f 41.22

您還可以在自己的C#應用​​程序中輕鬆託管PowerShell引擎。如果您向最終用戶提供要使命令行可編寫腳本的功能,則此功能非常實用。您可以將這些功能編寫爲PowerShell cmdlet(在C#中)。這些cmdlet然後可以直接在命令行中使用,如果你在你的GUI應用主機的PowerShell,你就可以從那裏訪問同一套代碼,如:

private bool VerifyPowerShellScriptSignature(string path) 
    { 
     using (var runspaceInvoker = new RunspaceInvoke()) 
     { 
      Collection<PSObject> results = 
       runspaceInvoker.Invoke("Get-AuthenticodeSignature " + path); 
      Signature signature = results[0].BaseObject as Signature; 
      return signature == null ? false : 
           (signature.Status == SignatureStatus.Valid); 
     } 
    } 
+0

PowerShell 2.0還增加了超強大的Add-Type Cmdlet,它可以讓用戶將各種語言的JIT編譯CLR代碼直接集成到PowerShell中;它平衡增加了P/Invoke的可能性! –

+0

+1優秀的職位。對於.net開發人員Powershell如何來得方便的很好的描述 –