PowerShell gegen die Unix-Shell

14

Ich habe einige Dinge über die Funktionen der PowerShell gehört. Einige davon scheinen typische Merkmale von Unix-Shells zu sein.

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

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

Mnementh
quelle
2
Diese Frage wurde bereits bei StackOverflow gestellt
Richard

Antworten:

20

PowerShell ähnelt oberflächlich Unix-Shells. PowerShell verfügt über Aliase für viele der Befehle, die Sie in Unix gewohnt sind, z. B. ls, rm, cp, mv usw. Die Funktionsweise der Cmdlets hinter den Aliasen ist jedoch sehr unterschiedlich.

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

Dies hat zur Folge, dass die Weiterleitung von einem Befehl zu einem anderen nicht nur die Weiterleitung von stdout zu stdin ist. Es leitet ein vollwertiges .net-Objekt an den Empfänger weiter. Daher muss der Empfänger nur wissen, wie er mit einem Objekt dieses Typs umgeht. Es muss kein Parsen von Text implementiert werden, aber es muss verstehen, wie Methoden und Eigenschaften (Member) des Eingabeobjekts aufgerufen werden.

In einem * nix-Befehlszeilenprogramm würden Sie Code schreiben, der aus stdin liest und dessen Informationen aus dem Text analysiert, den ein anderes Programm generiert hat. In PowerShell würden Sie 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
}

Das Aufrufen 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önnen auch das Gleiche wie oben mit dem Piping-Mechanismus tun, aber Sie können den Hauptunterschied hier darin sehen, dass wir ein Objekt und keinen Text übergeben:

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

Wenn ich diesen großen Unterschied vergesse, würde ich sagen, dass es andere oberflächliche Ähnlichkeiten gibt, aber meistens nur syntaktisch. Die PowerShell-Syntax wurde anscheinend unter Berücksichtigung der Benutzer der * nix-Shell entwickelt, daher ähnelt sich ein Großteil des Sprachstils.

Robert S. Ciaccio
quelle