PowerShell 与 Unix Shell

Mne*_*nth 14 unix powershell shell

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

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

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

Rob*_*cio 22

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

在命令行上调用此代码可能如下所示:

PS> $myObject = New-Object MyType -arg "OriginalName"
PS> $myObject = changeName $myNewObject
OriginalName
PS> $myObject.Name
NewName
Run Code Online (Sandbox Code Playgroud)

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

PS> $myObject = New-Object MyType -arg "OriginalName" | changeName
OriginalName
PS> $myObject.Name
NewName
Run Code Online (Sandbox Code Playgroud)

忘记这个主要区别,我会说还有其他表面的相似之处,但主要是语法上的。PowerShell 语法似乎是为 *nix shell 用户设计的,因此很多语言风格是相似的。