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 等。

在 *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 使用者設計的,因此許多語言風格都是相似的。

相關內容