2009-05-21 47 views
27

A前面我正在閱讀PowerShell中的多變量賦值。這讓你做這樣的事情什麼是PowerShell語言中最有用但鮮爲人知的一些功能

64 > $a,$b,$c,$d = "A four word string".split() 

65 > $a 
A 

66 > $b 
four 

或者你可以在一個聲明中交換變量

$a,$b = $b,$a 

什麼的PowerShell鮮爲人知掘金讓你遇到,你認爲可能還不如衆所周知的他們應該是?

+0

Andy,您是將此限制在PowerShell 1.0中,還是2.0可以討論? – 2009-05-21 14:53:22

+0

任何版本都很好 – 2009-05-21 15:00:24

+1

當人們發表想法時,說出他們支持哪個版本(1/2)會有幫助。 – Nate 2009-05-21 15:21:49

回答

19

$$命令。我經常需要在同一個文件路徑上重複操作。例如簽出一個文件,然後在VIM中打開它。該$$特性使得這個簡單的

PS> tf edit some\really\long\file\path.cpp 
PS> gvim $$ 

這是短期和簡單,但它節省了大量的時間。

13

$ OFS - output field separator。一種方便的方法來指定如何呈現時爲一個字符串數組元素被分離:

PS> $OFS = ', ' 
PS> "$(1..5)" 
1, 2, 3, 4, 5 
PS> $OFS = ';' 
PS> "$(1..5)" 
1;2;3;4;5 
PS> $OFS = $null # set back to default 
PS> "$(1..5)" 
1 2 3 4 5 

Always guaranteeing you get an array result。考慮下面的代碼:在這種情況下

PS> $files = dir *.iMayNotExist 
PS> $files.length 

$文件可能是$ NULL,標量值或值的數組。 $ files.length不會給你爲$ null或單個文件找到的文件數量。在單個文件的情況下,你會得到文件的大小!每當我不知道我有多少數據會回來,我總是在數組中的子表達式請將命令,像這樣:

PS> $files = @(dir *.iMayNotExist) 
PS> $files.length # always returns number of files in array 

然後$文件將始終是一個數組。它可能是空的,或者只有一個元素,但它是將是是一個數組。這使得結果的推理更加簡單。

陣列協方差支持:

PS> $arr = '127.0.0.1','192.168.1.100','192.168.1.101' 
PS> $ips = [system.net.ipaddress[]]$arr 
PS> $ips | ft IPAddressToString, AddressFamily -auto 

IPAddressToString AddressFamily 
----------------- ------------- 
127.0.0.1   InterNetwork 
192.168.1.100  InterNetwork 
192.168.1.101  InterNetwork 

Comparing arrays using Compare-Object

PS> $preamble = [System.Text.Encoding]::UTF8.GetPreamble() 
PS> $preamble | foreach {"0x{0:X2}" -f $_} 
0xEF 
0xBB 
0xBF 
PS> $fileHeader = Get-Content Utf8File.txt -Enc byte -Total 3 
PS> $fileheader | foreach {"0x{0:X2}" -f $_} 
0xEF 
0xBB 
0xBF 
PS> @(Compare-Object $preamble $fileHeader -sync 0).Length -eq 0 
True 

富勒更多這樣的東西,看看我的免費電子書 - Effective PowerShell

10

沿着多變量分配的路線。

$列表= 1,2,3,4

雖然($列表){
$頭,$列表= $列表
$頭
}

15

我發現的一個功能經常被忽略,能夠將文件傳遞給switch語句。

開關將遍歷行並匹配字符串(或帶有-regex參數的正則表達式),變量的內容,數字或行可以傳遞到表達式以評估爲$ true或$ false

switch -file 'C:\test.txt' 
{ 
    'sometext' {Do-Something} 
    $pwd {Do-SomethingElse} 
    42 {Write-Host "That's the answer."} 
    {Test-Path $_} {Do-AThirdThing} 
    default {'Nothing else matched'} 
} 
6

,許多運營商上的陣列一起使用,以及和返回元件,其中的比較爲真,或者陣列獨立地中的每個元素進行操作的事實:

1..1000 -lt 800 -gt 400 -like "?[5-9]0" -replace 0 -as "int[]" -as "char[]" -notmatch "\d" 

這比Where-Object更快。

19

到目前爲止,PowerShell最強大的功能是它的ScriptBlock支持。事實上,你可以簡單地傳遞沒有任何類型約束的有效匿名方法,它的功能和C++函數指針一樣強大,並且像C#或F#lambdas一樣簡單。

我的意思是說,使用ScriptBlocks你可以實現一個「using」語句(PowerShell本身沒有)是多麼酷。或者,在v2之前,你甚至可以實施try-catch-finally

function Using([Object]$Resource,[ScriptBlock]$Script) { 
    try { 
     &$Script 
    } 
    finally { 
     if ($Resource -is [IDisposable]) { $Resource.Dispose() } 
    } 
} 

Using ($File = [IO.File]::CreateText("$PWD\blah.txt")) { 
    $File.WriteLine(...) 
} 

這有多酷!

8

我一直在使用這樣的:

if (!$?) { # if previous command was not successful 
    Do some stuff 
} 

,我也使用$ _(當前管道對象)相當多,但這些可能會比其他東西更聞名。

3

不是一種語言功能,但超有用

f8 - 帶您已經把已文本,並搜索與文本開始的命令。

3

通過你的歷史標籤搜索與#

例子:

PS> GET-Process Explorer的
PS> 「福特探索者」
PS> 「麥哲倫」 |添加內容「大explorers.txt」
PS>鍵入「偉大explorers.txt」
PS> #expl < - 通過具有術語「EXPL」

歷史條目擊中<標籤>鍵循環
1

迭代向後一個序列只是使用該序列的LEN與該範圍的一個阿瑟賽德1 ..

的foreach(X在seq.length..1){DO-東西SEQ [X]}

相關問題