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, поэтому многие языковые стили схожи.