前段时间我正在阅读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 $$
它简短而简单,但可以节省大量时间.
到目前为止,PowerShell最强大的功能是ScriptBlock支持.事实上你可以如此简洁地传递什么是有效的匿名方法而没有任何类型约束,这与C++函数指针一样强大,就像C#或F#lambdas一样简单.
我的意思是,使用ScriptBlocks你可以实现一个"使用"语句(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(...) }
多么酷啊!
我发现的一个功能经常被忽略的是将文件传递给switch语句的能力.
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'} }
$ OFS - 输出字段分隔符.一种指定数组元素在呈现给字符串时如何分离的方便方法:
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
始终保证您获得阵列结果.考虑以下代码:
PS> $files = dir *.iMayNotExist PS> $files.length
在这种情况下,$ files可以是$ null,标量值或值数组.$ files.length不会为您提供$ null或单个文件的文件数.在单个文件的情况下,您将获得文件的大小!每当我不确定我将获得多少数据时,我总是将命令包含在数组子表达式中,如下所示:
PS> $files = @(dir *.iMayNotExist) PS> $files.length # always returns number of files in array
那么$ files将永远是一个数组.它可以是空的,或者它在只具有单个元件,但它会是一个数组.这使得推理结果更加简单.
阵列协方差支持:
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
使用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
更多这样的东西,看看我的免费电子书 - 有效的PowerShell.
沿着多变量任务的路线.
$ list = 1,2,3,4
虽然($ list){
$ head,$ list = $ list
$ head
}
1
2
3
4
我一直在用这个:
if (!$?) { # if previous command was not successful Do some stuff }
而且我也使用$ _(当前管道对象)相当多,但这些可能比其他东西更为人所知.
事实上,许多运算符也在数组上工作,并返回比较为真的元素,或者独立地对数组的每个元素进行操作:
1..1000 -lt 800 -gt 400 -like "?[5-9]0" -replace 0 -as "int[]" -as "char[]" -notmatch "\d"
这比快Where-Object
.