当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《PowerShell语言中有哪些最有用但鲜为人知的功能》经验,为你挑选了7个好方法。

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

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

65 >  $a
A

66 >  $b
four

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

$a,$b = $b,$a

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



1> JaredPar..:

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

PS> tf edit some\really\long\file\path.cpp
PS> gvim $$

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



2> Josh..:

到目前为止,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(...)
}

多么酷啊!



3> Steven Muraw..:

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



4> Keith Hill..:

$ 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.



5> Doug Finke..:

沿着多变量任务的路线.

$ list = 1,2,3,4

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

1
2
3
4



6> Bratch..:

我一直在用这个:

if (!$?) {  # if previous command was not successful
    Do some stuff
}

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



7> 小智..:

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

1..1000 -lt 800 -gt 400 -like "?[5-9]0" -replace 0 -as "int[]" -as "char[]" -notmatch "\d"

这比快Where-Object.

推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有