2016 年 10 月

第 31 卷,第 10 期

本文章是由機器翻譯。

基本的.NET-PowerShell 更趨完善

Mark Michaelis |2016 年 10 月

作者:Mark Michaelis在.NET Core 上,我最近的焦點離開,本月的基本.NET 資料行中我將重點放在 Windows PowerShell 的強大功能會大幅增加的新功能的主機上。對我來說,最重要的改良功能是跨平台支援的區域中 — 沒錯,其實是 PowerShell 現在會在執行 Linux 上。不只如此,但它也已經移到 GitHub 上的開放原始 (github.com/PowerShell/PowerShell),讓社群可以開始來增強其功能。很酷 !

但最新的宣告不說明一切。回到二月,PowerShell 5.0 發行,其中包括新增或改進支援類別和列舉的宣告、 模組和指令碼探索、 管理套件和安裝、 OData 端點存取、 增強的轉譯和記錄,以及其他。在本文中我要檢閱這些功能,並提供範例。

PowerShell 會跨平台

若要開始,看看下列的命令指令碼,這會在 Ubuntu 14.04 從 Windows PowerShell 主機上的 PowerShell 安裝以及執行工作階段中,從 Windows Bash 中的螢幕擷取畫面 [圖 1 (如您不熟悉 Bash Windows 10 週年紀念日更新上執行 Ubuntu,請參閱 「 Windows 10 上的安裝 Bash 」。)︰

wget -O powershell.deb https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-alpha.9/powershell_6.0.0-alpha.9-1ubuntu1.14.04.1_amd64.deb
sudo apt-get install libunwind8 libicu52
sudo dpkg -i powershell.deb
powershell

安裝和 Windows 上執行 Ubuntu 14.04 從 Bash 在 Ubuntu 上的 Windows PowerShell
[圖 1 所安裝,並在 Windows 上執行 Ubuntu 14.04 從 Bash 在 Ubuntu 上的 Windows PowerShell

請注意命令指令碼特別目標 Ubuntu 14.04。針對其他平台,deb 套件 URL 和必要的版本而異。請參閱 bit.ly/2bjAJ3H 特定平台上的指示。

許多年前現在 Jeffrey Snover 的推文 PowerShell 可以合理預期出現在 Linux 上,但是花了這麼久,而且已有幾個進度報告,即使在今天,因為我使用我很訝異讓。您說嗎? 我執行 Bash Ubuntu 在 Windows 上執行 (而不使用任何虛擬化技術) 和 (假設我不想直接在相同的 Bash 執行個體安裝 PowerShell) 上使用 SSH 連線到遠端 Bash 工作階段我可以在其中安裝 PowerShell 並使用管線將.NET 物件之間在 Bash 殼層命令。

如果我有建議會將這幾年前我懷疑許多會總是相信辛勤我。

在 Windows 10 上安裝 Bash

從 Windows 10 週年紀念日版開始,您可以使用下列 Windows PowerShell 命令安裝到 Windows 原生 Bash:

Get WindowsOptionalFeature-線上 FeatureName * linux * |Enable-windowsoptionalfeature /norestart-所有 – 線上

但是請注意,這是仍在 beta 版並,因此,只有在開發人員模式 (使用 「 取得說明 WindowsDeveloper 」 以了解如何瀏覽開發人員模式下)。

不幸的是,這項功能確實需要重新啟動,但是我包含-/norestart 選項,以便啟用功能並不直接觸發程序重新啟動。

PowerShell 儲存機制和 PowerShell 組件庫

很不錯,您可以撰寫指令碼和程式庫,很可能,在社群中其他人已經完成步驟類似的程式碼,您可以運用,並加以改善。PowerShell 組件庫的問世之前 (PowerShellGallery.com),不過,您必須徹底搜尋網際網路,找到指令碼和模組,可能會很有用 — 它們是社群貢獻還是官方的 PowerShell 產品版本 Pscx 或 Posh-git 模組等。其中一個的較新的 PowerShell 改進 (PowerShell 5.0 的一部分) 我變成完全取決於為新的儲存機制支援,特別是 PowerShell 組件庫。例如,假設,您最近撰寫 PowerShell 段時間,如此一來,您已將會察覺有許多的陷阱,若要避免的要是有辦法分析程式碼,並找到它們。這一點之後,您可以瀏覽至 PowerShell 組件庫,並在搜尋中進行分析] 模組來安裝。或甚至更好的 (因為您可能已經有開啟 PowerShell 視窗),您可以利用 PowerShellGet 模組尋找模組命令 (隨附於 PowerShell 5.0)︰

Find-Module *Analyze* | Select-Object Name,Description

其輸出所示 [圖 2

尋找模組命令的輸出
[圖 2 尋找模組命令輸出

請注意,是否您沒有足夠現代化的版本,安裝 nuget,運用 PowerShellGet 模組就會觸發 NuGet 套件的更新。

假設您找到您想要的模組,您可以檢視其內容透過儲存模組命令。若要安裝的模組,使用安裝模組 (在此情況下,安裝模組 PSScriptAnalyzer) 命令。這會下載此模組,並將它安裝為您建立可用模組內包含的所有函式。在安裝之後 PSScriptAnalyzer 模組,您可以叫用 Invoke-ScriptAnalyzer $profile 來掃描您的設定檔,並指出分析器會考慮次佳的考量。(請注意它已不再需要匯入模組,才能存取它。模組函式會自動編製索引,當您叫用模組函式時,模組會自動匯入,並可依需求。)

請注意,PowerShell 組件庫預設會設定為儲存機制︰

>Get-PSRepository
Name         InstallationPolicy   SourceLocation
----         ------------------   --------------
PSGallery    Untrusted            https://www.powershellgallery.com/api/v2/

如此一來,尋找模組就不會出現問題。不過,安裝模組將會提示您有不受信任的儲存機制的警告。若要避免此,假設您的確信任儲存機制,可以設定為受信任的命令︰

Set-PSRepository -Name PSGallery -InstallationPolicy Trusted

Apt-get for Windows PowerShell 封裝管理

您身為 IT 專業人員,Linux 世界中的任何時間花了毫無疑問採取專門 get 理所當然 — 可能是啟動其環境的那一刻起,啟動新的 Linux 執行個體的安裝指令碼。對於您還沒有,專門 get 是下載並安裝程式/封裝及任何相依性快速且輕鬆地從網際網路直接從命令列命令列方法。[圖 1 示範簡單的範例,這類安裝時它會利用專門 get 安裝 libunwind8 libicu52,PowerShell (在 Ubuntu 14.04) 而定。與 PowerShell 5.0 相同的功能是 Windows (我不確定是否說話,「 yahoo ! 」 或 exasperatedly 囉,「 最後 」 !— 甚或兩者)。

就如同儲存機制,像是 PowerShell 組件庫,PowerShell 模組 PowerShell 5.0 也支援管理程式,稱為套件 — 在 Windows 中。一個這類封裝管理員是 Chocolatey (chocolatey.org),並將它加入做為封裝儲存機制,使用下列命令︰

Get-PackageProvider -Name chocolatey

這可讓您使用 PowerShell 來尋找已部署至 Chocolatey 的套件。例如,如果您想要安裝 Visual Studio 程式碼,您只需要輸入命令︰

Find-Package V*S*Code | Install-Package

如所示,支援萬用字元。

熟悉的其他封裝命令可使用下列命令,其結果顯示在 [圖 3:

Get-Help "-package" | Select-Object Name,Synopsis

使用 Windows PowerShell 封裝命令
[圖 3 可用的 Windows PowerShell 封裝的命令

如您所見,您可以同時取得並解除安裝封裝。取得封裝列出所有的程式 (以及其他) 可從控制台的 [程式和功能。因此,如果您想要解除安裝 Notepad2,比方說,您可以使用此命令︰

Get-Package Notepad2* | Uninstall-Package

這時會自動化 Windows 電腦安裝輕鬆究竟。我已經將多個年頭 Chocolatey 風扇,這會將 Chocolatey 支援直接整合至 Windows。它最後會將管理套件 windows 中非常 Apt Get 並在 Linux 類似的方式。

要考量的一件事是,不只可以 Chocolatey 儲存機制透過 *-封裝 * PowerShell 命令,但 Chocolatey 也可以安裝直接。雖然並非必要,直接安裝 Chocolatey 會偶爾會有封裝管理功能更強大的功能集。幸運的是,或許諷刺安裝 Chocolatey 很簡單,只要叫用 Chocolatey 安裝套件的但 (這是 Chocolatey 之間差異的範例和 *-封裝行為),預設安裝位置會取決於使用的安裝引擎。簽出 chocolatey.org/install 如需有關 Chocolatey 工具組,包括您的環境的安裝指示。

與匯出 ODataEndpointProxy OData

另一個值得一提的 PowerShell 5.0 功能是能夠產生一組存取 OData 資料來源等 Visual Studio Team Services (VSTS) 的方法。[圖 4 示範這種情況下將匯出 ODataEndpointProxy OData 服務,公用範例 Northwind OData 服務上執行。

產生和叫用 OData Proxy
[圖 4 所產生,並叫用 OData Proxy

如果您瀏覽產生的模組的命令,您會看到不同的命令會產生每個實體 (廣告、 分類、 人員等等),以及相對應的動作,每個 (Get、 新增、 移除、 設定)。

請注意,在命令列中的一件事 [圖 4 -AllowUnsecureConnection 參數使用。這是必要的因為在此範例中所用的 OData 服務不需要驗證或加密。

從文字轉換成具有 ConvertFrom 字串的物件

另一個新的命令才會出現在 PowerShell 5.0 是 ConvertFrom 字串。它的設計是採取結構化的文字做為輸入,並進行插補的結構,以便輸出剖析文字為基礎的物件。您可以使用,例如,剖析一般檔案或 (和這是我在哪裡找到它非常有用) 從可執行檔的文字輸出轉換成物件。

例如,考慮 SysInternal 的 handle.exe 程式 (您可以使用安裝套件處理命令來安裝 — 利用管理套件上, 一節中所述)。如您所預期從命令列公用程式,它會寫出至 stdout 的文字,在此情況下一份開啟的控制代碼相關聯的名稱。在 PowerShell 中,不過,您已成為習慣使用物件。若要轉換的文字輸出至物件,您使用 ConvertFrom 字串函式中所示 [圖 5

利用 ConvertFrom 字串剖析 stdout,到物件
[圖 5 利用 ConvertFrom 字串剖析成物件的 stdout

[圖 5 一開始會顯示原始 handle.exe 公用程式的輸出。接下來,它會示範 ConvertFrom 字串未使用任何參數。如此一來,ConvertFrom 字串公用程式只會分割根據泛空白字元每一行文字。

在第三個範例中,我要示範以微調剖析指定的規則運算式分割模式的選項。不過請注意,不需要使用規則運算式的熟悉度。您可以改為指定的範本 — 或許是更精確的範例 — 將檔案或字串,在其中您前幾個項目手動剖析。ConvertFrom 字串接著會利用範例剖析的內容,並解釋如何剖析輸入的其餘部分。

在最後一個範例中,我加入-PropertyNames 參數,以便將有意義的名稱指派給輸出。

最後,ConvertFrom 字串橋接文字為基礎的世界傳統的程序 stdout 與內建物件上的 PowerShell 世界的阻抗不的相符。在此情況下,我可以將輸出傳送至 Stop-process-識別碼對應的 pid 值-Id 參數值。

類別和列舉

最後,這是取消上新的類別和列舉型別支援。在 PowerShell 5.0 對應至兩個結構,以便您現在可以宣告類別或直接在 PowerShell 中的列舉型別 (而不是使用加入型別和傳遞 C# 程式碼或可能具現化 PSCustomObject) 加入兩個新的關鍵字。語法是您所預期,請參閱 [圖 6

[圖 6 宣告類別,以及在 Windows PowerShell 中列舉

enum CustomProcessType {
  File
  Section
}
class CustomProcess {
  [string]$ProcessName;
  hidden [string]$PIDLabel;
  [int]$PID;
  hidden [string]$TypeLabel;
  [CustomProcessType]$Type;
  [int]$Handle;
  [string]$Path;
  CustomProcess(
    [string]$processName,[string]$pidLabel,[int]$pid,
    [string]$typeLabel,[string]$type,[int]$handle,[string]$path) {
    $this.ProcessName = $processName;
    $this.PIDLabel=$pidLabel;
    $this.PID=$pid;
    $this.TypeLabel=$typeLabel;
    $this.Type=$type;
    $this.Handle=$handle;
    $this.Path=$path;
  }
  CustomProcess() {}
  GetProcess() {
    Get-Process -Id $this.PID
  }
  static StopProcess([CustomProcess]$process) {
    Stop-Process -Id $process.PID
  }
}

請注意,特別是,支援屬性和方法。此外,我們宣告修飾詞像靜態和隱藏,因此會將指定的相關聯的結構。此外,非常類似於 C# 語法支援繼承︰

class Employee : Person {}

最後,以及示範在 [圖 6, ,可以宣告建構函式。在此範例中,我宣告的預設建構函式 (無參數) 和第二個建構函式之所有參數。建構函式會叫用透過 [新增物件] 命令,藉由指定 [-ArgumentList 參數 (如果列建構函式引數的陣列),否則透過-Property 參數傳遞的引數的雜湊表。

總結

無法列出這是 PowerShell 5.0 的新功能的完整清單。其他值得注意的項目包括︰

  • 封存 (.zip 檔案支援) 的壓縮封存和展開封存命令透過整合。
  • 同樣也可以使用管線運算子的 get 剪貼簿和組剪貼簿的命令。
  • 輸出檔案中,新增內容和設定內容包含 – NoNewline 參數,以省略新行字元的檔案內容。
  • 新增 TemporaryFile 命令運作方式類似於 [System.IO.Path]::GetTempFileName (雖然不完全相同)。及其.NET 對等項目,例如新增 TemporaryFile 不刪除暫存檔案,因此請務必儲存輸出,以便完成之後,您使用它,您可以移除該檔案。
  • SymbolicLinks 現在可以直接從 PowerShell 指令程式新增項目和移除項目管理。
  • PowerShell 整合式指令碼環境 (ISE) 現在支援透過 / 停止/搜尋 Start-transcript 函式的記錄之前發生錯誤時從 PowerShell ISE 中呼叫它。

此外,雖然不支援立即 PowerShell 的開放原始碼版本中,Microsoft 完全打算支援開啟 SSH 確認,它會在 PowerShell 中,以及在這篇文章已發行的 Windows 遠端管理,在遠端處理傳輸選項。

所有這說 PowerShell 只會取得更好的而且效果更好。如果您還沒有了解它尚未,完成。


Mark Michaelis 是的 IntelliTect,他擔任其技術架構設計人員和培訓講師的創辦人。 近二十他一直是 Microsoft MVP,以及 Microsoft 區域經理自 2007年。Michaelis 做數個 Microsoft 軟體設計檢閱小組成員,包括 C#、 Microsoft Azure、 SharePoint 和 Visual Studio ALM。他開發人員會議上發表演說,並且已撰寫許多本書,包括他最新,「 基本 C# 6.0 (第 5 版)。 」  在 Twitter 上與他聯絡:: @markmichaelis 或透過電子郵件地 mark@IntelliTect.com

感謝下列 IntelliTect 技術專家來檢閱這份文件︰ Kevin Bost、 Phil Spokas 和 Michael Stokesbary