A前面我正在閱讀PowerShell中的多變量賦值。這讓你做這樣的事情什麼是PowerShell語言中最有用但鮮爲人知的一些功能
64 > $a,$b,$c,$d = "A four word string".split()
65 > $a
A
66 > $b
four
或者你可以在一個聲明中交換變量
$a,$b = $b,$a
什麼的PowerShell鮮爲人知掘金讓你遇到,你認爲可能還不如衆所周知的他們應該是?
A前面我正在閱讀PowerShell中的多變量賦值。這讓你做這樣的事情什麼是PowerShell語言中最有用但鮮爲人知的一些功能
64 > $a,$b,$c,$d = "A four word string".split()
65 > $a
A
66 > $b
four
或者你可以在一個聲明中交換變量
$a,$b = $b,$a
什麼的PowerShell鮮爲人知掘金讓你遇到,你認爲可能還不如衆所周知的他們應該是?
$$
命令。我經常需要在同一個文件路徑上重複操作。例如簽出一個文件,然後在VIM中打開它。該$$
特性使得這個簡單的
PS> tf edit some\really\long\file\path.cpp
PS> gvim $$
這是短期和簡單,但它節省了大量的時間。
$ 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。
沿着多變量分配的路線。
$列表= 1,2,3,4
雖然($列表){
$頭,$列表= $列表
$頭
}
我發現的一個功能經常被忽略,能夠將文件傳遞給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'}
}
,許多運營商上的陣列一起使用,以及和返回元件,其中的比較爲真,或者陣列獨立地中的每個元素進行操作的事實:
1..1000 -lt 800 -gt 400 -like "?[5-9]0" -replace 0 -as "int[]" -as "char[]" -notmatch "\d"
這比Where-Object
更快。
到目前爲止,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(...)
}
這有多酷!
我一直在使用這樣的:
if (!$?) { # if previous command was not successful
Do some stuff
}
,我也使用$ _(當前管道對象)相當多,但這些可能會比其他東西更聞名。
不是一種語言功能,但超有用
f8
- 帶您已經把已文本,並搜索與文本開始的命令。
通過你的歷史標籤搜索與#
例子:
PS> GET-Process Explorer的
PS> 「福特探索者」
PS> 「麥哲倫」 |添加內容「大explorers.txt」
PS>鍵入「偉大explorers.txt」
PS> #expl < - 通過具有術語「EXPL」
迭代向後一個序列只是使用該序列的LEN與該範圍的一個阿瑟賽德1 ..
的foreach(X在seq.length..1){DO-東西SEQ [X]}
Andy,您是將此限制在PowerShell 1.0中,還是2.0可以討論? – 2009-05-21 14:53:22
任何版本都很好 – 2009-05-21 15:00:24
當人們發表想法時,說出他們支持哪個版本(1/2)會有幫助。 – Nate 2009-05-21 15:21:49