共用方式為


Windows PowerShell:新殼層中的新語法

Windows PowerShell 版本 3 中的部分新的語法命令可幫助您撰寫容易讀取但是具有某些限制的命令。

Don Jones

Windows PowerShell 3 版中的新功能之一是語法的在哪裡物件和 ForEach 物件 cmdlet 的新形式。 通常,這些 cmdlet 都接受 scriptblock (在哪裡-物件的情況下它叫做 filterscript,因為它必須返回 $True 或 $False)。

內,scriptblock,您使用 $_ 預留位置符號來表示"無論管道給 cmdlet。"下麵是一個示例使用兩個 cmdlet (這不是一個明智的真實的命令,但它演示的 cmdlet 使用):

Get-WmiObject –class Win32_LogicalDisk | Where-Object –filterscript{ $_.DriveType –eq 3 } | ForEach-Object –process { $_.ChkDsk() }

你從沒見過這些寫出這樣的命令。 人們傾向于使用別名、 截斷的參數名稱和位置參數保存打字。 不尋常的加入有以下:

gwmi Win32_LogicalDisk | ? { $_.DriveType –eq 3 } | % { $_.ChkDsk() }

沒有什麼比有點神秘的語法,確保工作安全,好嗎? 在哪裡物件的新語法允許您執行此操作:

gwmi Win32_LogicalDisk | where DriveType –eq 3 | % { $_.ChkDsk() }

我切換到不同的別名 cmdlet 的通知。 您仍然可以使用嗎? 如果你想要的但是,我發瘋。 我來自長基本的背景,哪裡? 是一個列印語句的快捷方式。 閱讀嗎? 在 Windows PowerShell 命令會傷害我的大腦。 我也已經免除大括弧和 $_ 符號。

實質上,在哪裡物件現在有位置參數接受您要篩選上 (在我的示例中為 DriveType) 的屬性。 它定義了所有主要的 Windows PowerShell 運算子 (--ne,,eq-喜歡,-gt,等等) 作為參數。 該參數的值是您要篩選的值 (在這裡,值是 3)。 這個縮寫形式是易於閱讀,但您可以只將其用於一個比較。 例如,以下不是法律的語句:

Gwmi Win32_Service | Where StartMode –eq 'Auto' –and State –ne 'Running'

為此,你不得不切換回舊學校語法:

Gwmi Win32_Service | Where { $_.StartMode –eq 'Auto' –and $_.State –ne 'Running' }

ForEach 物件獲取類似的、 減少標點語法形式:

gwmi Win32_LogicalDisk | where DriveType –eq 3 | foreachChkDsk()

再次,我換成的 ForEach 別名,而不是 %,從而使這更易於閱讀。 您可以繼續使用 %,如果你願意的話。 Mvp 寫道我同胞之一很好的博客文章有關這些縮短形式,而且很值得一讀。 他還介紹了 $PSItem,而這似乎是常常被誤解的 $_ 符號的全域替換。

就個人而言,我百感交集有關這些新的語法形式。 一方面,他們肯定更容易把握的新手。 消除大括弧和總是令人困惑的 $_ 是偉大的。 另一方面,這些新的形式並不是完全正常的。 他們只能做一個比較。 您仍然需要學習的舊的語法。

還有,有六年多的舊式語法遍佈在人們的博客、 雜誌上的文章和書籍。 仍然,你就需要知道舊的語法,使這些示例的意識。

因此這種新語法不能根除需要知道舊的語法。 它只是意味著你必須要記住的一個而不是兩種形式。 不過,它是我們所要工作,這就是我們的工作的方式。

Don Jones

Don Jones  是 Microsoft MVP 獎得主和"學習 Windows PowerShell 中月的午餐 」 (曼甯發佈 2011年),旨在説明成為有效的 Windows PowerShell 任何管理員一本書的作者。 鐘斯還提供公共和現場 Windows PowerShell 培訓。 與他通過聯繫 ConcentratedTech.combit.ly/AskDon

相關內容