2009-05-21 82 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]}

相关问题