PowerShell语言中有哪些最有用但鲜为人知的功能

And*_*der 26 powershell

前段时间我正在阅读PowerShell中的多变量赋值.这可以让你做这样的事情

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

65 >  $a
A

66 >  $b
four
Run Code Online (Sandbox Code Playgroud)

或者您可以在单个语句中交换变量

$a,$b = $b,$a
Run Code Online (Sandbox Code Playgroud)

你认为你所知道的那些鲜为人知的PowerShell小块可能并不像它们应该的那样众所周知?

Jar*_*Par 19

$$命令.我经常需要在同一文件路径上重复操作.例如,签出一个文件,然后在VIM中打开它.该$$功能使这一点变得微不足道

PS> tf edit some\really\long\file\path.cpp
PS> gvim $$
Run Code Online (Sandbox Code Playgroud)

它简短而简单,但可以节省大量时间.


Jos*_*osh 19

到目前为止,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(...)
}
Run Code Online (Sandbox Code Playgroud)

多么酷啊!


Ste*_*ski 15

我发现的一个功能经常被忽略的是将文件传递给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'} 
}
Run Code Online (Sandbox Code Playgroud)


Kei*_*ill 13

$ 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
Run Code Online (Sandbox Code Playgroud)

始终保证您获得阵列结果.考虑以下代码:

PS> $files = dir *.iMayNotExist
PS> $files.length
Run Code Online (Sandbox Code Playgroud)

在这种情况下,$ files可以是$ null,标量值或值数组.$ files.length不会为您提供$ null或单个文件的文件数.在单个文件的情况下,您将获得文件的大小!每当我不确定我将获得多少数据时,我总是将命令包含在数组子表达式中,如下所示:

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

那么$ 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
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

更多这样的东西,看看我的免费电子书 - 有效的PowerShell.


Dou*_*nke 10

沿着多变量任务的路线.

$ list = 1,2,3,4

虽然($ list){
$ head,$ list = $ list
$ head
}

1
2
3
4


Bra*_*tch 8

我一直在用这个:

if (!$?) {  # if previous command was not successful
    Do some stuff
}
Run Code Online (Sandbox Code Playgroud)

而且我也使用$ _(当前管道对象)相当多,但这些可能比其他东西更为人所知.


小智 6

事实上,许多运算符也在数组上工作,并返回比较为真的元素,或者独立地对数组的每个元素进行操作:

1..1000 -lt 800 -gt 400 -like "?[5-9]0" -replace 0 -as "int[]" -as "char[]" -notmatch "\d"
Run Code Online (Sandbox Code Playgroud)

这比快Where-Object.