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