Share via


Windows PowerShell:語法捷徑

在 Windows PowerShell 中要達成相同的目的通常有多種方法。 找出適合您的方法,然後堅持下去。

Don Jones

我又愛又恨的 Windows PowerShell 的事情之一是其固有的靈活性。 在許多方面,它是寫像一種程式設計語言。 如果你不是一個程式師,很大程度可以忽略,和把它像一個命令列的外殼。

嗯,也許並不完全"忽略。"你看,總是似乎那裡三個或四個不同的方式做幾乎任何事情在 Windows PowerShell 中。 你真的只需要知道你最有意義的一種方法。 然而,一個智慧的 Windows PowerShell 使用者,會熟悉一切手段來完成一個給定的任務。 這樣一來,你在看例子寫的其他人,你就當能夠理解你現在看到。

所有關于該別名

別名是你們中的大多數會遇到的第一個"捷徑"。 請看下面這個命令:

PS C:\> Get-WmiObject -class Win32_LogicalDisk -Filter "DriveType=3" | >> Where-Object -FilterScript{ $_.FreeSpace / $_.Size -lt .1 } | >> Select-Object -Property DeviceID,FreeSpace,Size >>

它喜歡的快捷方式,您可以這樣:

PS C:\>gwmi Win32_LogicalDisk -Fi "DriveType=3" | >> ?{ $_.FreeSpace / $_.Size -lt .1 } | >> SelectDeviceID,FreeSpace,Size >>

我已使用別名命令的名稱的位置,我已經被截斷參數,以更少的字元。 Windows PowerShell 中,可以將參數名稱截斷,只要你提供足夠的它為要唯一標識每個參數的名稱。 這讓更少的鍵入,但更難讀的命令。 我律師我一切闡明你發佈一個示例、 將其保存在一個腳本或以其他方式使它永久的工件時的學生。 這將使它易於以後標識。

在 Windows PowerShell 伊勢和大多數其他編輯器中,可以鍵入參數名稱的截斷的部分並擊中完成輸入整個名稱的選項卡。 有減少鍵入 — — 它是易於閱讀。 我完全省略掉其他參數的名稱,因為它們的位置參數。 換句話說,只要記得要按正確的順序排列成行的所有值,命令仍然有效。

再次,截斷的檔案名不是盡可能容易閱讀。 大多數人會感謝你的腳本中使用完整參數的名稱。 使用完整參數名稱最終是件少工作上你,因為你不必記住他們進來什麼順序。 使用名稱時,您可以將它們放在任何你想要的命令。

在引號中的運算式

有時,您需要插入帶引號的字串運算式的結果。 這允許您在您的腳本輸出中包括該結果。 執行此操作的一種方法是將結果存儲在變數中。 然後,使用 Windows PowerShell 訣竅的插入雙引號字串變數。 Windows PowerShell 將使用其內容替換變數:

$disk = Get-WmiObject -class Win32_LogicalDisk -filter "DeviceID='C:'" $freepercent = $disk.freespace / $disk.size * 100 Write-Host "Free space on drive C: at $freepercent percent"

Windows PowerShell 還允許您將放在雙引號內完整的運算式。 語法被從 Unix shell 把戲。 它看起來有點不可思議,但你會看到很多使用它的人:

$disk = Get-WmiObject -class Win32_LogicalDisk -filter "DeviceID='C:'" Write-Host "Free space on drive C: at $($disk.freespace / $disk.size * 100) percent"

我更喜歡第一種形式,主要是因為我傾向于大多是使用 Windows PowerShell 初學者。 第一種形式是有點易於閱讀。 每個步驟的腳本,使邏輯有點容易遵循上發生了一件事。

Windows PowerShell 使用第二種形式似乎更混亂足夠標點符號。 然而,第二種形式也是技術上有點更有效率。 它不創建 Windows PowerShell 具有跟蹤的變數。 它還涉及到的一點少打字,你最喜歡看起來。

建立物件

長形式再次當需要創建自訂物件:

$cs = Get-WmiObject -class Win32_ComputerSystem $os = Get-WmiObject -class Win32_OperatingSystem $obj = New-Object -TypeNamePSObject $obj | Add-Member -MemberTypeNoteProperty -Name OSVersion -Value $os.version $obj | Add-Member -MemberTypeNoteProperty -Name Mfgr -Value $cs.manufacturer $obj | Add-Member -MemberTypeNoteProperty -Name Model -Value $cs.model Write-Output $obj

有時我會快捷這只是有點使用此技術,它將添加成員命令合併到單個管道:

$cs = Get-WmiObject -class Win32_ComputerSystem $os = Get-WmiObject -class Win32_OperatingSystem $obj = New-Object -TypeNamePSObject $obj | Add-Member -MemberTypeNoteProperty -Name OSVersion -Value $os.version –PassThru | Add-Member -MemberTypeNoteProperty -Name Mfgr -Value $cs.manufacturer –PassThru | Add-Member -MemberTypeNoteProperty -Name Model -Value $cs.model –PassThru

最近,我開始切換到略有不同的技術,更可讀的是:

$cs = Get-WmiObject -class Win32_ComputerSystem $os = Get-WmiObject -class Win32_OperatingSystem $props = @{'OSVersion'= $os.version; 'Mfgr'=$cs.manufacturer; 'Model'=$cs.model} $obj = New-Object -TypeNamePSObject -Property $props Write-Output $obj

再次,我傾向于這種長形式是語法的因為其可讀性。 我工作主要是與 Windows PowerShell 新人,以便説明他們瞭解正在發生的可讀性至關重要。 此外,您還將看到鄉親用這一招:

$obj = Select-Object OSVersion,Mfgr,Model $obj.OSVersion = $os.version $obj.Mfgr = $cs.manufacturer $obj.Model = $cs.model $obj

結果基本上是相同的和最後一項用途有點少打字。 這是種駭客技巧,使用這種方式的選擇物件。 它利用你可以告訴要選擇一個不存在的屬性的選擇物件的事實。 實際上,它將創建屬性,具有空值輸出物件上。

讓我看到選擇物件實際上痛苦使用 (或者,更準確地說,濫用) 這種方式,並不是唯一的一個。 早在 2008 年,我的同胞們的一些 Windows PowerShell Mvp 都公開反對這種用法。 不管的你感受這種技術,你應該學會承認它,使你知道做什麼。

在 Windows PowerShell 版本 3,你實際上會能夠執行此操作:

[pscustomobject]@{'OSVersion'= $os.version; 'Mfgr'=$cs.manufacturer; 'Model'=$cs.model}

我還沒決定我怎麼看待這種語法,但通常是確定。 它仍然是相當可讀,並消除了打字。 人們將開始使用它,所以您應該識別它的是什麼。 最後的技術看起來也更快地執行 (閱讀更多關於它對 Jonathan Medd 博客)。

物件的快捷方式

您經常會看到的最後快捷技術是類似于運算式的字串。 這是完全合法的程式設計語法 — — 它只是令人困惑的新人。 儘管如此,沒有什麼"錯誤的"有了它,所以你應該習慣把它和知道做什麼。

說要執行一些方法的物件,然後做了些什麼一個生成的物件的屬性,如下所示:

$string = ' Hello ' $string = $string.Trim() $string.Length

您可以快捷所有的使用括弧。 首先,計算括弧運算式並將 Windows PowerShell 基本上替換括弧及其結果:

$string = ' Hello ' ($string.Trim()).length

它較量標點了很多,所以扯塊並確定什麼,你的大腦有點更難,但它是完全合法的。 它可能甚至執行稍微有點快,因為 Windows PowerShell 不必對多次作為變數進行操作。

對所有的遺憾

在某些方面,不幸 Windows PowerShell 不能提供一個方法來做任何事情。 然後我們將所有僅要學習的東西,一種方式。 事實上,我們有一個外殼,提供了很多不同的語法變化本質上是相同的任務是什麼。 是值得的至少熟悉許多語法替代方案。 這樣,您可以使用任何的例子,你會遇到。

Raymond Chen

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

相關內容