有的管理员经常问“为什么是Windows PowerShell?”他们想知道为什么在他们已经知道或者能灵活使用如VBScript或Perl这样的语言后,还应该学习这个特殊的脚本语言。 答案很简单:交互对象(Interactive object)。这意味着不仅仅是访问对象。这里的关键点是PowerShell里的每样事物都是一个对象。
尽管开始使用PowerShell的目的可能不明确,可是你一旦明白了如何使用PowerShell,你就会离不开它。例如,下面是使用VBscript与PowerShell完成任务“列出唯一文件扩展”的代码。 VBScript Const adVarChar ……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属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的对象本质非常有用,让其成为一种非常不同的脚本语言。
翻译
相关推荐
-
应用PowerShell进行SharePoint Online管理
在应用PowerShell在线管理SharePoint之前,管理员需要进行一系列准备工作,例如下载SharePoint Online Management Shell等。
-
两种方式将Windows容器部署到微软Azure中
想要创建并管理Windows Server容器吗?本文将会介绍如何利用本地Docker命令和PowerShell模块来实现以上目标。
-
PowerShell脚本示例及管理员参考指南
精明的Windows专业人士和管理员甚至也会做出比卷子袖子干事更加愚笨的事情,为了实现自动化任务,他们需要了解脚本语言以及所有PowerShell工具。
-
如何使用PowerShell管理Windows服务
管理员如何在本地或者远程计算机上操控服务,面对变几十台甚至几百台机器时,PowerShell就派上用场了。