2011-10-17 30 views

回答

5

Powershell已经有一个非常干净的语法,所以没有太多需要改进。

一个新此外,我做喜欢的是Hash Table as objects,在那里你可以通过hastable与它的属性创建对象:

[<ClassName>]$Variable = @{<Property>=<Value>;<Property>=<Value>} 

所以创建自定义对象的更新,更简洁的方式是:

$obj = [PSCustomObject]@{a=1; b=2; c=3; d=4} 

重定向已经加强。除了正常(流水线)和错误外,现在您还可以进行冗余,调试和警告,因此您可以执行重定向,如5>&1

您可以使用$PSDefaultParameterValues首选变量为cmdlet设置默认参数值。

有新[ordered]加速器创建有序hastable(字典):

$a = [ordered]@{a=1;b=2;d=3;c=4} 

从这里SO另一个答案,我意识到,-in在PowerShell中3.0是新的:

所以你做一些像1 -in 1,2,3。以前我们只有-contains

的cmdlet:

您可以Update-Help cmdlet的更新的帮助。有与网络相关的cmdlet,如Invoke- WebRequest。您还可以使用ConverTo-JSONConvertFrom-JSON cmdlet处理JSON。

+0

“hastable(dictionary)”:我认为'dictionary'和'hashtable'是的代名词。也许我对Python中的字典感到困惑,但是字典不会强加顺序,是吗?你能澄清一下吗? –

7

下面是一个例子:

dir | where length -lt 10

3.0之前,它会一直

dir | where {$_.length -lt 10}

编辑:另一个例子,这次用foreach对象

dir | foreach-object length

+0

+1 - 之前没有注意到这一点。 – manojlds

+0

我同意提交者。这是我期望看到的一些文章,因为它使脚本更容易阅读。不过,我不认为我喜欢它。 –

9

许多常见的*-Object cmdlet都使用多个参数集来完成简化的语法。看看这个在V3:

C:\PS> Get-Command Where-Object -Syntax 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] [-EQ] [<CommonParameters>] 

Where-Object [-FilterScript] <scriptblock> [-InputObject <psobject>] [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CGT [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CNE [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -LT [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CEQ [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -NE [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -GT [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CLT [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -GE [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CGE [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -LE [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CLE [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -Like [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CLike [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -NotLike [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CNotLike [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -Match [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CMatch [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -NotMatch [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CNotMatch [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -Contains [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CContains [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -NotContains [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CNotContains [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -In [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CIn [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -NotIn [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CNotIn [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -Is [<CommonParameters>] 

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -IsNot [<CommonParameters>] 

注意:检查出新的运营商-NotIn-In如:

C:\PS> 1 -In 1..5 
C:\PS> 10 -NotIn 1..5 

所以简化语法是“共同”的情况下很好,但看出来的你可以很容易地掉入锋利的岩石和熔岩中,例如:

C:\PS> Get-ChildItem | Where LastWriteTime.Year -eq 2010 

这将返回什么更糟糕的,没有错误,所以你想结果集是“正确”的空当,其实这句法只是不为你所期望的工作。也就是说,您无法访问属性的属性。在上面,PowerShell寻找一个名为LastWriteTime.Year的属性,该属性不存在。

另请注意,作为简化语法的一部分,您现在可以使用$PSItem代替$_,以防您或您编写脚本的人对$_产生某种过敏反应。 :-)

虽然这不一定是联系在一起的简化的语法我发现,它简化了我的生活,我喜欢它:

C:\PS> Get-ChildItem -Directory 
C:\PS> Get-ChildItem -File 
C:\PS> dir -ad 
C:\PS> Get-ChildItem -Attributes System+Hidden+Directory+!Archive 
+0

对于'$ PSItem'为+1。顺便说一句,你怎么知道这些事情?整个事情记录在案吗? – manojlds

+1

是的,我不喜欢简单的语法,在哪里等...比我想象的更多的麻烦。 – manojlds

+1

我自己有点担心简化语法。我明白了让管理员更容易进入PowerShell的愿望,但我不确定这不仅仅是“诱饵&交换机”。时间会告诉我猜。至于发现这些事情,作为MVP有其特权。 :-)尽管如此,PowerShell团队和他们的MVP之间的交互效果相当不错,因为他们早在2006年就开始在PowerShell中授予MVP。 –

相关问题