WindowsPowerShell实用教程TT服务器技术专题之“WindowsPowerShell实用教程”Page2of38WindowsPowerShell实用教程WindowsPowerShell是微软交互式命令shell和脚本语言。Windows管理员在WindowsXP、WindowsServer2003和WindowsVista中都能用到WindowsPowerShell,WindowsServer2008中也有它的身影。但是你如何从WindowsPowerShell脚本开始呢?作为一本WindowsPowerShell教程,本专题特为系统管理员汇集了所有新命令和脚本的建议。WindowsPowerShell特性作为最受欢迎且受众最广的脚本语言,WindowsPowerShell绝不会让管理员感到陌生。它到底有什么魅力在此领域多年来保持王者地位屹立不倒呢?是什么造就了它的独一无二?在本小节中,我们将一起来看看WindowsPowerShell的一些特性与功能。为什么WindowsPowerShell是独一无二的?认识WindowsPowerShell函数的参数PowerShell脚本新移动功能来袭实用工具:WindowsPowerShell初步了解了WindowsPowerShell的一些特性与功能,具体运用中,我们不可能将所以功能一次性用到,那么,我们在不同的情况下要挑选哪些不同的功能呢?让我们根据专家经验来挑选一些功能,让这个实用工具来为我们好好服务吧。WindowsPowerShell五大Cmdlet命令分享Windows管理员常用的25个PowerShell命令TT服务器技术专题之“WindowsPowerShell实用教程”Page3of38替代活动目录管理的PowerShell命令WindowsPowerShell的错误处理WindowsPowerShell解决方案我们已经为砍柴磨好了刀,下一步也是最重要的一步就是进入实践操作了。如何在实践中运用这个工具呢?遇到不同的问题该如何解决?我们总结了多种状况并提供了相应的解决方案,有了专家们的经验与意见,你可以与烦恼和担心告别了。如何用批处理文件确定虚拟机运行什么?如何控制WindowsPowerShell命令输出?打造属于你的WindowsPowerShell如何自定义WindowsPowerShell环境?使用PowerShell管理WindowsServer2008R2TT服务器技术专题之“WindowsPowerShell实用教程”Page4of38为什么WindowsPowerShell是独一无二的?有的管理员经常问“为什么是WindowsPowerShell?”他们想知道为什么在他们已经知道或者能灵活使用如VBScript或Perl这样的语言后,还应该学习这个特殊的脚本语言。答案很简单:交互对象(Interactiveobject)。这意味着不仅仅是访问对象。这里的关键点是PowerShell里的每样事物都是一个对象。尽管开始使用PowerShell的目的可能不明确,可是你一旦明白了如何使用PowerShell,你就会离不开它。例如,下面是使用VBscript与PowerShell完成任务“列出唯一文件扩展”的代码。VBScriptConstadVarChar=200ConstMaxCharacters=255SetobjRecordSet=CreateObject(ADOR.Recordset)objRecordSet.Fields.AppendExtension,adVarChar,MaxCharactersobjRecordSet.OpenSetobjFso=CreateObject(Scripting.FileSystemObject)ifWscript.Arguments.Count=0thenstrFolder=objFso.GetAbsolutePathName(.)elsestrFolder=Wscript.Arguments(0)endififnotobjFso.FolderExists(strFolder)thenWscript.EchostrFolder¬foundWscript.QuitendifSetobjFolder=objFso.GetFolder(strFolder)ForEachobjFileInobjFolder.FilesstrExtension=objFso.GetExtensionName(objFile)objRecordSet.FindExtension='&strExtension&'If(objRecordSet.BOF=True)OR(objRecordSet.EOF=True)Then'RecordnotfoundobjRecordSet.AddNewobjRecordSet(Extension)=strExtensionobjRecordSet.UpdateElseTT服务器技术专题之“WindowsPowerShell实用教程”Page5of38'skipEndIfobjRecordSet.MoveFirstNextobjRecordSet.Sort=ExtensionobjRecordSet.MoveFirstDoUntilobjRecordSet.EOFWscript.EchoobjRecordSet.Fields.Item(Extension)objRecordSet.MoveNextLoopPowerShellGet-childitem|group-objectextension|select-objectname虽然这个代码在VBScript里并不复杂,但它在PowerShell里只需要一行代码。但是PowerShell是如何起作用的?下面我们分解下这个代码:Get-ChildItem这是一个内置的cmdlet,列出给定路径里的文件和文件夹。这里的关键是它不仅仅只返回一串你想要的信息,而是返回这个对象的所有信息。如果使用I(下面我们将讲到),这些对象然后传递到控制台或者另一个cmdlet。在上面的例子中,这个对象将发送到另一个叫做group-object的cmdlet里。如果我们只调用了Get-ChildItem,Powershell将发送对象到控制台。这是管道操作符。能用于多数shell,从一个命令传递数据到另一个。PowerShell使用这个传递输出的对象到其他cmdlet。注意,这会传递整个对象,而不仅仅是你所看见的。Group-Object这个命令可以收集对象,并通过特性进行分类。在本文例子中,特性就是Extension,但它可能是上面任何的属性。Select-Object这个命令允许你调出你想保存的对象。这还不是所有的。如果你不想仅仅通过扩展名分类,也想通过总体文件大小分类,使用下面命令就可做到:TT服务器技术专题之“WindowsPowerShell实用教程”Page6of38Get-Childitem-Recurse-ea0|?{!$_.PSIsContainer}|Group-ObjectExtension|selectname,@{n=GroupSize;e={($_.group|measure-object-sumLength).sum}}|Sort-Object-DescendingGroupSize-ea0如果你是WindowsPowershell新手,上面的例子可能有点复杂。下面的完成相同任务的语句更简单。$ScriptBlock=@{n=GroupSize;e={($_.group|measure-object-sumLength).sum}}$FilesByExtension=Get-Childitem-Recurse-ea0|?{!$_.PSIsContainer}|Group-ObjectExtension$FilesByExtension|select-objectName,$ScriptBlock|Sort-Object-DescendingGroupSize-ea0更多关于Powershell的信息,可以查看在BSonPoSH.com网站查看Cooldemovideoandcode。总的来说,WindowsPowerShell的对象本质非常有用,让其成为一种非常不同的脚本语言。(作者:BrandonShell译者:唐琼瑶来源:TechTarget中国)原文标题:为什么WindowsPowerShell是独一无二的?原文链接:服务器技术专题之“WindowsPowerShell实用教程”Page7of38认识WindowsPowerShell函数的参数在先前关于用户自定义的WindowsPowerShell的的文章中,我已经说过PowerShell中的最大特点之一是函数使用上的可扩展性强。在这篇文章中,我们将仔细看一下专业类型的函数:产品质量函数。你问有什么区别?产品质量函数花力气来测试输入并在提供信息输出的情况下为算是错误进行稳固工作。通常当在为产品运用函数时,你想知道它是否中断--同时你也一定很想知道为什么。其它的语言需要你自己来设计参数和处理错误。我们是幸运的,WindowsPowerShell有许多类似的内置函数。PowerShell的参数当我们谈论WindowsPowerShell函数的时候,我们需要考虑三件事情:输入、输出和错误。这篇文章将重点说明输入,也被称为参数。PowerShell有许多参数选项,并且可以通过以下三种方式之一来进行运用:位置参数PowerShell可以创建一个数值数组传递给函数的$args变量。传递给函数的每一个值从0开始被添加到这个数组中。例如:functionfoo{Write-Host$args[0]$args[1]}fooThisisparameter1Thisisparameter2名字参数PowerShell输入的参数也可以命名,这就意味着它们可以通过名字传递,并且值被放置在相应的变量里。例如(注意当这个函数被调用的时候,参数颠倒,但是数值能正确的返回):Example(noticetheparametersarereversedwhenthefunctioniscalled,butthevaluesarereturnedcorrectly):functionfoo{TT服务器技术专题之“WindowsPowerShell实用教程”Page8of38Param($param1,$param2)Write-Host$param1$param2}foo-param2Thisisparameter2-param1Thisisparameter1Splatting参数在PowerShell的参数传递中,这个或许是最常用的方法。它包含创建一个数组或哈希表作为传递给函数的参数组。这个让你可以动态地创建整个脚本的参数,然后当你准备好后即可调用函数。例如:functionfoo{Param($param1,$param2)Write-Host$param1$param2}CreateHashtable$blah=@{Param1=Thisisparameter1;Param2=Thisisparameter2}#Passhashtabletofunctionfoo@BlahPowerShell参数的属性Mandatory–这个属性在PowerShell参数选项里是默认的,但是如果你知道你所需要的参数类型,你可以使用这个属性来强制用户传递这种类型的参数。如果它们没有这样做,PowerShell将报错给它们,并且强迫的它们提供这种类型的值,以便函数能够正常的运行。例如:functionfoo{Param([Parameter(Mandatory=$True)]$param1