Answers:
PowerShell从表面上类似于Unix Shell。PowerShell为您在Unix中常用的许多命令提供了别名,例如ls,rm,cp,mv等。但是,别名后面的cmdlet的工作方式完全不同。
在* nix外壳程序中,所有内容都是基于文本的,因此可以将一个命令的输出传递给另一个命令,但是接收程序必须知道如何解析/解释管道中的文本。这是PowerShell和* nix shells之间的主要区别。在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用户,因此许多语言样式都相似。