PowerShell rất giống với hệ vỏ Unix. PowerShell có bí danh cho nhiều lệnh bạn đã sử dụng trong Unix, như ls, rm, cp, mv, v.v. Tuy nhiên, cách mà các lệnh ghép ngắn đằng sau các bí danh hoạt động hoàn toàn khác nhau.
Trong trình bao * nix, mọi thứ đều dựa trên văn bản, do đó, đầu ra từ một lệnh có thể được chuyển sang lệnh khác, nhưng chương trình nhận phải biết cách phân tích / giải thích văn bản từ đường ống. Đây là điểm khác biệt chính giữa các vỏ PowerShell và * nix ... trong PowerShell, mọi thứ được truyền xung quanh là một đối tượng.
Hậu quả của việc này là đường ống từ lệnh này sang lệnh khác không chỉ là đường ống dẫn đến stdin. Đó là đường ống một đối tượng .net đầy đủ đến máy thu. Do đó, người nhận chỉ cần biết cách xử lý một đối tượng thuộc loại đó. Nó không cần phải thực hiện bất kỳ phân tích cú pháp văn bản nào, nhưng nó cần hiểu cách gọi các phương thức và thuộc tính (thành viên) của đối tượng đầu vào.
Trong chương trình dòng lệnh * nix, bạn sẽ viết mã đọc từ stdin và phân tích thông tin của nó từ văn bản mà chương trình khác tạo ra. Trong PowerShell, bạn sẽ làm một cái gì đó như thế này:
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
}
Gọi mã này trên dòng lệnh có thể giống như:
PS> $myObject = New-Object MyType -arg "OriginalName"
PS> $myObject = changeName $myNewObject
OriginalName
PS> $myObject.Name
NewName
Bạn cũng có thể làm tương tự như trên bằng cách sử dụng cơ chế đường ống, nhưng bạn có thể thấy sự khác biệt chính ở đây là chúng ta đang truyền một đối tượng chứ không phải văn bản:
PS> $myObject = New-Object MyType -arg "OriginalName" | changeName
OriginalName
PS> $myObject.Name
NewName
Quên đi sự khác biệt lớn này, tôi sẽ nói có những điểm tương đồng bề ngoài khác, nhưng chủ yếu chỉ là về mặt cú pháp. Cú pháp PowerShell dường như đã được thiết kế dành cho người dùng shell * nix, vì vậy rất nhiều kiểu ngôn ngữ tương tự nhau.