为什么Windows PowerShell是独一无二的?

日期: 2010-01-11 作者:Brandon Shell翻译:唐琼瑶 来源:TechTarget中国 英文

有的管理员经常问“为什么是Windows PowerShell?”他们想知道为什么在他们已经知道或者能灵活使用如VBScript或Perl这样的语言后,还应该学习这个特殊的脚本语言。   答案很简单:交互对象(Interactive object)。这意味着不仅仅是访问对象。这里的关键点是PowerShell里的每样事物都是一个对象。

  尽管开始使用PowerShell的目的可能不明确,可是你一旦明白了如何使用PowerShell,你就会离不开它。例如,下面是使用VBscript与PowerShell完成任务“列出唯一文件扩展”的代码。   VBScript Const adVarChar ……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

有的管理员经常问“为什么是Windows PowerShell?”他们想知道为什么在他们已经知道或者能灵活使用如VBScript或Perl这样的语言后,还应该学习这个特殊的脚本语言。

  答案很简单:交互对象(Interactive object)。这意味着不仅仅是访问对象。这里的关键点是PowerShell里的每样事物都是一个对象。

  尽管开始使用PowerShell的目的可能不明确,可是你一旦明白了如何使用PowerShell,你就会离不开它。例如,下面是使用VBscript与PowerShell完成任务“列出唯一文件扩展”的代码。

  VBScript

Const adVarChar = 200
Const MaxCharacters = 255
Set objRecordSet = CreateObject("ADOR.Recordset")
objRecordSet.Fields.Append "Extension", adVarChar, MaxCharacters
objRecordSet.Open
Set objFso = CreateObject("Scripting.FileSystemObject")
if Wscript.Arguments.Count = 0 then
    strFolder = objFso.GetAbsolutePathName(".")
else
     strFolder = Wscript.Arguments(0)
end if
if not objFso.FolderExists(strFolder) then
    Wscript.Echo strFolder & " not found"
    Wscript.Quit
end if
Set objFolder = objFso.GetFolder(strFolder)
For Each objFile In objFolder.Files
    strExtension = objFso.GetExtensionName(objFile)
    objRecordSet.Find "Extension = '" & strExtension & "' "
    If (objRecordSet.BOF = True) OR (objRecordSet.EOF = True) Then
        ' Record not found
        objRecordSet.AddNew
        objRecordSet("Extension") = strExtension
        objRecordSet.Update
    Else
        ' skip
    End If
    objRecordSet.MoveFirst
Next
objRecordSet.Sort = "Extension"
objRecordSet.MoveFirst
Do Until objRecordSet.EOF
    Wscript.Echo objRecordSet.Fields.Item("Extension")
    objRecordSet.MoveNext
Loop

  PowerShell

Get-childitem | group-object extension | select-object name

  虽然这个代码在VBScript里并不复杂,但它在PowerShell里只需要一行代码。但是PowerShell是如何起作用的?下面我们分解下这个代码:

  Get-ChildItem

  这是一个内置的cmdlet,列出给定路径里的文件和文件夹。这里的关键是它不仅仅只返回一串你想要的信息,而是返回这个对象的所有信息。如果使用I(下面我们将讲到),这些对象然后传递到控制台或者另一个cmdlet。

  在上面的例子中,这个对象将发送到另一个叫做group-object的cmdlet里。如果我们只调用了Get-ChildItem,Powershell将发送对象到控制台。

  这是管道操作符。能用于多数shell,从一个命令传递数据到另一个。PowerShell使用这个传递输出的对象到其他cmdlet。注意,这会传递整个对象,而不仅仅是你所看见的。

  Group-Object

  这个命令可以收集对象,并通过特性进行分类。在本文例子中,特性就是Extension,但它可能是上面任何的属性。

  Select-Object

  这个命令允许你调出你想保存的对象。

  这还不是所有的。如果你不想仅仅通过扩展名分类,也想通过总体文件大小分类,使用下面命令就可做到:

Get-Childitem -Recurse -ea 0 | ?{!$_.PSIsContainer} | Group-Object Extension | select name,@{n="GroupSize";e={($_.group | measure-object -sum Length).sum}} | Sort-Object -Descending GroupSize -ea 0

  如果你是Windows Powershell新手,上面的例子可能有点复杂。下面的完成相同任务的语句更简单。

$ScriptBlock = @{n="GroupSize";e={($_.group | measure-object -sum Length).sum}} $FilesByExtension = Get-Childitem -Recurse -ea 0 | ?{!$_.PSIsContainer} | Group-Object Extension $FilesByExtension | select-object Name,$ScriptBlock | Sort-Object -Descending GroupSize -ea 0

  更多关于Powershell的信息,可以查看在BSonPoSH.com网站查看Cool demo video and code

  总的来说,Windows PowerShell的对象本质非常有用,让其成为一种非常不同的脚本语言。

相关推荐