PowerShell im Vergleich zur Unix-Shell

PowerShell im Vergleich zur Unix-Shell

Ich habe einiges über die Funktionen von PowerShell gehört. Einiges davon scheint typische Funktionen von Unix-Shells zu sein.

Es scheint also, dass Powershell Piping und die Commandlets enthält, ähnlich wie Shell-Skripte. Aber ich habe es noch nicht ausprobiert (kein Windows), also kann ich mich irren.

Meine Frage ist also: Ist Powershell einer Unix-Shell ähnlich oder ist das Konzept anders?
Wenn letzteres zutrifft: In welchen Punkten unterscheidet sich das Konzept?

Antwort1

PowerShell ähnelt oberflächlich betrachtet Unix-Shells. PowerShell hat Aliase für viele der Befehle, die Sie unter Unix gewohnt sind, wie ls, rm, cp, mv usw. Die Funktionsweise der Cmdlets hinter den Aliasen ist jedoch ganz anders.

In einer *nix-Shell ist alles textbasiert, sodass die Ausgabe eines Befehls an einen anderen weitergeleitet werden kann, das empfangende Programm jedoch wissen muss, wie der Text aus der Pipeline analysiert/interpretiert wird. Dies ist der Hauptunterschied zwischen PowerShell- und *nix-Shells ... in PowerShellallesdas herumgereicht wird, ist ein Objekt.

Die Konsequenz davon ist, dass das Weiterleiten von einem Befehl zum anderen nicht nur das Weiterleiten von stdout an stdin ist. Es ist das Weiterleiten eines vollwertigen .net-Objekts an den Empfänger. Daher muss der Empfänger nur wissen, wie er mit einem Objekt dieses Typs umgeht. Er muss keine Textanalyse implementieren, aber er muss verstehen, wie er Methoden und Eigenschaften (Mitglieder) des Eingabeobjekts aufruft.

In einem *nix-Befehlszeilenprogramm würden Sie Code schreiben, der von stdin liest und seine Informationen aus dem von einem anderen Programm generierten Text analysiert. In PowerShell würden Sie etwa Folgendes tun:

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
}

Der Aufruf dieses Codes in der Befehlszeile könnte folgendermaßen aussehen:

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

Sie könnten dasselbe wie oben auch mithilfe des Piping-Mechanismus tun, aber Sie sehen hier den großen Unterschied, da wir ein Objekt und keinen Text übergeben:

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

Wenn man diesen großen Unterschied außer Acht lässt, würde ich sagen, dass es andere oberflächliche Ähnlichkeiten gibt, die sich aber hauptsächlich auf die Syntax beziehen. Die PowerShell-Syntax scheint für Benutzer von *nix-Shells entwickelt worden zu sein, daher ist der Sprachstil sehr ähnlich.

verwandte Informationen