PowerShell与Unix Shell


14

我听说过有关PowerShell功能的一些信息。其中一些似乎是Unix shell的典型功能。

因此,Powershell似乎包含管道和Commandlet,类似于Shell脚本。但是我还没有尝试过(没有Windows),所以我可能是错的。

所以我的问题是:Powershell与Unix Shell相似还是概念不同?
如果是后者:概念在哪些方面有所不同?


Answers:


20

PowerShell从表面上类似于Unix Shell。PowerShell为您在Unix中常用的许多命令提供了别名,例如ls,rm,cp,mv等。但是,别名后面的cmdlet的工作方式完全不同。

在* nix外壳程序中,所有内容都是基于文本的,因此可以将一个命令的输出传递给另一个命令,但是接收程序必须知道如何解析/解释管道中的文本。这是PowerShell和* nix shells之间的主要区别。在PowerShell中,传递的所有内容都是一个对象。

这样的结果是,从一个命令到另一个命令的管道传输不只是将stdout管道传输到stdin。它正在将完整的.net对象传送到接收器。因此,接收方只需要知道如何处理该类型的对象即可。它不需要实现任何文本解析,但是需要了解如何调用输入对象的方法和属性(成员)。

在* nix命令行程序中,您将编写从stdin读取并从另一个程序生成的文本中解析其信息的代码。在PowerShell中,您将执行以下操作:

function changeName($myObject)
{
    if ($myObject.GetType() -eq [MyType])
    {
        #print the current name to screen
        $myObject.Name
        #change string in the 'name' property
        $myObject.Name = "NewName"
    }
    return $myObject
}

在命令行上调用此代码可能类似于:

PS> $myObject = New-Object MyType -arg "OriginalName"
PS> $myObject = changeName $myNewObject
OriginalName
PS> $myObject.Name
NewName

您也可以使用管道机制来执行与上述相同的操作,但是您可以看到此处的主要区别在于我们传递的是对象而不是文本:

PS> $myObject = New-Object MyType -arg "OriginalName" | changeName
OriginalName
PS> $myObject.Name
NewName

忘了这个主要的区别,我想说还有其他表面上的相似之处,但大多数只是在语法上。PowerShell语法似乎在设计时考虑了* nix shell用户,因此许多语言样式都相似。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.