PowerShell 与 Unix Shell

PowerShell 与 Unix Shell

我听说过一些有关 PowerShell 的功能。其中一些功能看起来像是 Unix shell 的典型功能。

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

所以我的问题是:Powershell 是否与 Unix shell 类似,还是概念不同?
如果是后者:概念在哪些方面不同?

答案1

PowerShell 表面上与 Unix shell 类似。PowerShell 为您在 Unix 中常用的许多命令提供了别名,例如 ls、rm、cp、mv 等。但是,别名背后的 cmdlet 的工作方式却大不相同。

在 *nix shell 中,所有内容都是基于文本的,因此一个命令的输出可以通过管道传输到另一个命令,但接收程序必须知道如何解析/解释管道中的文本。这是 PowerShell 和 *nix shell 之间的主要区别...在 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 用户设计的,因此很多语言风格都很相似。

相关内容