PowerShell поверхнево схожий на оболонки Unix. PowerShell має псевдоніми для багатьох команд, до яких ви звикли в Unix, таких як ls, rm, cp, mv тощо. Однак спосіб роботи командлетів за псевдонімами зовсім інший.
У оболонці * nix все базується на тексті, тому вихід з однієї команди може бути переданий іншій, але програма, що приймає, повинна знати, як розбирати / інтерпретувати текст з конвеєра. Це головна відмінність PowerShell від * nix оболонок ... в 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, тому багато стилів мови схожі.