PowerShell, yüzeysel olarak Unix mermilerine benzer. PowerShell, Unix'te alışkın olduğunuz komutların çoğu için ls, rm, cp, mv vb. Gibi takma adlara sahiptir. Bununla birlikte, takma adların arkasındaki cmdlet'lerin çalışma şekli oldukça farklıdır.
* Nix kabuğunda, her şey metin tabanlıdır, bu nedenle bir komuttan çıktı başka bir boruya iletilebilir, ancak alıcı program, metnin boru hattından nasıl ayrıştırılacağını / yorumlanacağını bilmelidir. Bu PowerShell ve * nix kabukları arasındaki temel farktır ... PowerShell'de, etrafta dolaşan her şey bir nesnedir.
Bunun sonucu, bir komuttan diğerine yapılan boruların sadece stdout'u stdin'e borulaması olmadığıdır. Alıcıya tam teşekküllü bir .net nesnesini pipetliyor. Bu nedenle, alıcının sadece bu tür bir nesnenin nasıl işleneceğini bilmesi gerekir. Herhangi bir metin ayrıştırma uygulaması gerekmez, ancak giriş nesnesinin yöntemlerini ve özelliklerini (üyelerini) nasıl çağıracağını anlamalıdır.
* Nix komut satırı programında, stdin'den okunan ve başka bir programın oluşturduğu metinden bilgilerini ayrıştıran bir kod yazarsınız. PowerShell'de şöyle bir şey yaparsınız:
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
}
Bu kodu komut satırında çağırmak şöyle görünebilir:
PS> $myObject = New-Object MyType -arg "OriginalName"
PS> $myObject = changeName $myNewObject
OriginalName
PS> $myObject.Name
NewName
Borulama mekanizmasını kullanarak yukarıdakiyle aynı şeyi yapabilirsiniz, ancak burada metni değil bir nesneyi geçirmemizdeki en büyük farkı görebilirsiniz:
PS> $myObject = New-Object MyType -arg "OriginalName" | changeName
OriginalName
PS> $myObject.Name
NewName
Bu büyük farkı unutmadan, diğer yüzeysel benzerlikler olduğunu söyleyebilirim, ancak çoğunlukla sözdizimsel olarak. PowerShell sözdizimi * nix shell kullanıcıları göz önünde bulundurularak tasarlanmıştır, bu nedenle dil stilinin çoğu benzerdir.