391

Mastering Windows PowerShell Scriptingsentinel/roar/Mastering PowerShell-Packt...Table of Contents Mastering Windows PowerShell Scripting Credits Foreword About the Author About the

  • Upload
    others

  • View
    32

  • Download
    0

Embed Size (px)

Citation preview

  • MasteringWindowsPowerShellScripting

  • TableofContents

    MasteringWindowsPowerShellScripting

    Credits

    Foreword

    AbouttheAuthor

    AbouttheReviewers

    www.PacktPub.com

    Supportfiles,eBooks,discountoffers,andmore

    Whysubscribe?

    FreeaccessforPacktaccountholders

    InstantupdatesonnewPacktbooks

    Preface

    Whatthisbookcovers

    Whatyouneedforthisbook

    Whothisbookisfor

    Conventions

    Readerfeedback

    Customersupport

    Downloadingtheexamplecode

    Errata

    Piracy

    Questions

    1.Variables,Arrays,andHashes

    Variables

    Objectsstoredinvariables

    Arrays

    Single-dimensionarrays

    Jaggedarrays

    Updatingarrayvalues

    Hashes

  • Decidingthebestcontainerforyourscripts

    Summary

    2.DataParsingandManipulation

    Stringmanipulation

    Replacingandsplittingstrings

    Countingandtrimmingstrings

    TheTrimmethod

    TheSubstringmethod

    Thestringtrueandfalsemethods

    Numbermanipulationandparsing

    Formattingnumbers

    Formattingbytes

    Dateandtimemanipulation

    Forcingdatatypes

    Pipingvariables

    Summary

    3.ComparisonOperators

    Comparisonoperatorbasics

    Equalandnotequalcomparison

    Greaterthanandlessthancomparison

    Contains,like,andmatchoperators

    And/ORcomparisonoperators

    Bestpracticesforcomparisonoperators

    Summary

    4.Functions,Switches,andLoopsStructures

    Functions

    Loopingstructures

    Switches

    Combiningtheuseoffunctions,switches,andloops

    Bestpracticesforfunctions,switches,andloops

    Bestpracticesforfunctions

  • Bestpracticesforloopingstructuresandswitches

    Summary

    5.RegularExpressions

    Gettingstartedwithregularexpressions

    Regularexpressiongroupingconstructsandranges

    Regularexpressionquantifiers

    Regularexpressionanchors

    Regularexpressionsexamples

    Summary

    6.ErrorandExceptionHandlingandTestingCode

    Errorandexceptionhandling–parameters

    Errorandexceptionhandling–Try/Catch

    Errorandexceptionhandling–Try/Catchwithparameters

    Errorandexceptionhandling–legacyexceptionhandling

    Methodologiesfortestingcode

    Testingthe–WhatIfargument

    Testingthefrequency

    Hittestingcontainers

    Don’ttestinproduction

    Summary

    7.Session-basedRemoteManagement

    UtilizingCIMsessions

    Creatingasession

    Creatingasessionwithsessionoptions

    Usingsessionsforremotemanagement

    Removingsessions

    Summary

    8.ManagingFiles,Folders,andRegistryItems

    Registryprovider

    Creatingfiles,folders,andregistryitemswithPowerShell

    Addingnamedvaluestoregistrykeys

  • Verifyingfiles,folders,andregistryitems

    Copyingandmovingfilesandfolders

    Renamingfiles,folders,registrykeys,andnamedvalues

    Deletingfiles,folders,registrykeys,andnamedvalues

    Summary

    9.File,Folder,andRegistryAttributes,ACLs,andProperties

    Retrievingattributesandproperties

    Viewingfileandfolderextendedattributes

    Settingthemodeandextendedfileandfolderattributes

    Managingfile,folder,andregistrypermissions

    Copyingaccesscontrollists

    AddingandremovingACLrules

    Summary

    10.WindowsManagementInstrumentation

    WMIstructure

    UsingWMIobjects

    SearchingforWMIclasses

    Creating,modifying,andremovingWMIpropertyinstances

    Creatingpropertyinstances

    Modifyingpropertyinstances

    Removingpropertyinstances

    InvokingWMIclassmethods

    Summary

    11.XMLManipulation

    XMLfilestructure

    ReadingXMLfiles

    AddingXMLcontent

    ModifyingXMLcontent

    RemovingXMLcontent

    Summary

    12.ManagingMicrosoftSystemswithPowerShell

  • Managinglocalusersandgroups

    Managinglocalusers

    Managinglocalgroups

    Queryingforlocalusersandgroups

    ManagingWindowsservices

    ManagingWindowsprocesses

    InstallingWindowsfeaturesandroles

    Summary

    13.AutomationoftheEnvironment

    Invokingprogramsforautomation

    Usingdesiredstateconfiguration

    Authoringphase

    Stagingandremediationphase

    Detectingandrestoringdriftingconfigurations

    Summary

    14.ScriptCreationBestPracticesandConclusion

    Bestpracticesforscriptmanagement

    #commentingheaders

    Commentingcode

    Bestpracticesforscriptcreation

    Scriptstructure

    Otherimportantbestpracticesforscriptcreation

    Controllingsourcefiles

    Bestpracticesforsoftwareautomation

    Summary

    MasteringWindowsPowerShellScripting–conclusion

    Stayingconnectedwiththeauthor

    Index

  • MasteringWindowsPowerShellScripting

  • MasteringWindowsPowerShellScriptingCopyright©2015PacktPublishing

    Allrightsreserved.Nopartofthisbookmaybereproduced,storedinaretrievalsystem,ortransmittedinanyformorbyanymeans,withoutthepriorwrittenpermissionofthepublisher,exceptinthecaseofbriefquotationsembeddedincriticalarticlesorreviews.

    Everyefforthasbeenmadeinthepreparationofthisbooktoensuretheaccuracyoftheinformationpresented.However,theinformationcontainedinthisbookissoldwithoutwarranty,eitherexpressorimplied.Neithertheauthor,norPacktPublishing,anditsdealersanddistributorswillbeheldliableforanydamagescausedorallegedtobecauseddirectlyorindirectlybythisbook.

    PacktPublishinghasendeavoredtoprovidetrademarkinformationaboutallofthecompaniesandproductsmentionedinthisbookbytheappropriateuseofcapitals.However,PacktPublishingcannotguaranteetheaccuracyofthisinformation.

    Firstpublished:April2015

    Productionreference:1210415

    PublishedbyPacktPublishingLtd.

    LiveryPlace

    35LiveryStreet

    BirminghamB32PB,UK.

    ISBN978-1-78217-355-7

    www.packtpub.com

    http://www.packtpub.com

  • CreditsAuthor

    BrentonJ.W.Blawat

    Reviewers

    TimAmico

    ChristopheCRÉMON

    TomasRestrepo

    AcquisitionEditor

    MeetaRajani

    ContentDevelopmentEditor

    RohitSingh

    TechnicalEditor

    TanviBhatt

    CopyEditors

    HiralBhat

    SoniaMathur

    VikrantPhadke

    AlphaSingh

    ProjectCoordinator

    MaryAlex

    Proofreaders

    SimranBhogal

    SafisEditing

    MariaGould

    PaulHindle

    Indexer

    RekhaNair

    ProductionCoordinator

    AlwinRoy

    CoverWork

    AlwinRoy

  • ForewordWeallappreciatealittlesimplicitywhenitentersourbusy,complicatedlives.Technologyisnodifferent.Infact,thatiswhatweexpectfromtechnology—itshouldsimplifyourlives.Butitdoesn’talwaysworkthatway.

    Sometimestechnologycanintroducevexingproblemswedon’tanticipate.

    WitheveryversionofMicrosoftDOSandthenWindows,Microsoftincludedseparatecommand-lineinterfaceshells.Theshellcouldautomatesometasks,butnotallofthem.Sometaskshadtobeaccomplishedmanually,whichisantithetical—nearlyheretical—toourunderstandingoftechnology’srole.

    Whatshouldhavebeensimple,automatedtasksbecameslow,frustrating,andmanualchores.Thatconundrumdidn’tgounnoticed.

    Microsoftprovidedmuch-neededsimplicitywhenitintroducedPowerShellin2006.Taskautomationandconfigurationmanagementeliminatedagreatdealoftime-consumingmanualwork.Inshort,PowerShellwasagamechanger.

    PowerShellhassolvedmanyofthecommand-lineandscriptingissuesthatcomplicatedourwork.Itintroducedsimplicity.Ithelpedorganizationsbecomemoreagile,moreproductive,andsavemoney.PowerShellisapowerfultool,andithasdemonstrateditspracticalvaluemanytimes.

    Despiteitsutility,though,PowerShellremainsaconfusingtooltomanyITadministrators,andtheneedforgreaterclarityremains.

    ItisthroughthislensthatMr.BrentonBlawatprovidesaninsightfulnewanalysisofPowerShell—avaluableguidebookforthosewhostruggletounderstandPowerShell.OthershaveofferednarrativesthatattempttoexplainPowerShell,buttheyrarelyprovidetheroadmap,background,orcontextthatadministratorsneedtogetfromPointAtoPointB.

    So,thisistherighttimeforacomprehensivenewanalysis.

    Ingeneralterms,Mr.Blawat’sbookwillhelpthosewhostruggletomanagetheircomputeenvironments.ItincludesimportantguidanceonprogramminginPowerShell,startingwithbasicconceptsandthenintroducingadvancedconfigurations.

    Mr.Blawatdeconstructsanddemystifiesthisprogramminglanguage,sharinghisintimateknowledgeinaformatthatdemonstratestheclarityofthoughtandprosethatadifficultsubjectrequires.Manyauthorshaveattemptedthisclimb,butonlyMr.Blawathasreachedthesummit.Hisexaminationprovidesrelevantinformationforadministratorswhoworkwith—andsometimesstrugglewith—PowerShellonadailybasis.

    AsMr.Blawatexplainsinthefollowingpages,therapidadoptionofcloud-basedtechnologiesparalleledthenever-endingneedforadditionalcomputingpowerindatacenters.Thiscreatedtheneedtoefficientlybuildandexpandsystemswithextremeprecision.Inadditiontoprovisioningthebasesystems,therewasaneedtodynamically

  • customizethesenewsystemstoworkinunisonwithcurrentrunningenvironments.

    Thisdrovetheneedforthenextgenerationsystemautomationlanguagesthatwouldprovidefullconfigurationforsystemsonthefly.Notonlydotheseautomationlanguagesgreatlyreducetimetouse,buttheyalsoensurethatnomistakesaremadeduringtheconfigurationprocess.Allsystemsarecreatedequally.

    PowerShellisa.NET-basednextgenerationautomationlanguagethatprovidesbothsystemsprovisioningandmanagementfunctionalityforWindows-basedsystems.Leveragingcommand-linelikeinteractions,PowerShellcanbecompiledintoscriptsthatcansystematicallyexecutetasksonasystem.Notlimitedtocreatingnewsystems,engineersareleveragingPowerShelltoautomatemundanetaskssothattheycanfocusonotherpressingactivitiesintheirenvironments.

    MicrosofthasfullyembracedPowerShellinitsfullsoftwareportfoliotoofferfullintegrationwithitsproducts.NotonlycanyoudynamicallyinstalltheMicrosoftsoftware,butyoucanalsofullymanagetheentireMicrosoftsoftwareenvironmentusingPowerShell.PowerShellhasalsobeenembracedbythird-partymanufacturersthroughtheintegrationofPowerShellmodules.Thesemodulesprovidefullmanagementcapabilitiesforproductssuchasnetworkdevices,storagesubsystems,virtualizationguestsandhosts,securityappliances,andotherthird-partyapplications.

    Likemanyorganizations,CDWhasbenefittedgreatlyfromPowerShell,sothisbookhitsveryclosetohomeforme.WeusePowerShellscriptstomanagecustomerenvironmentsinmanagedservicesandtheinstallationofmanagementtools.

    WeuseMicrosoftOrchestratortoprovideback-endlogicforsimpleuserinterfacesforhelpdeskactivities,likeuser-drivenpasswordresetsanduser-drivensoftwareinstallations.WealsorelyonMicrosoftOrchestratortoautomaticallytroubleshootandremediatesystems.

    CDW’scustomersalsobenefitfromPowerShellinmyriadways.WeassistawidevarietyofFortune500clientstodevelopPowerShellautomationscriptstobuildnewsystemsandmanagetheirenvironments,includinghealthcheckscripts,systemsdiscovery,andadvancedregulatorysecurityanalysis.

    Clearly,PowerShell’sincredibleutilityhasmadeitinvaluabletoCDW,ourcustomers,andcountlessorganizationsacrosstheglobe.Butunderstandingallofitsmanyfacetsrepresentsadauntingtask.OrganizationsareunabletoleveragePowerShelliftheydon’tfullyunderstanditspotential.

    That’swhereMr.Blawatexcels.

    Mr.Blawat’scomprehensivenewworkwillserveasareferencetoolforengineerswhoworkwithWindowsbytakingthemysteryoutofcommontasksthataren’teasilyunderstoodandaren’talwaysintuitive.DiligentreaderswillnodoubtfindmanymorereasonstogiveMr.Blawat’sthoroughnarrativeaprominentplaceontheirbookshelves.

    AsMr.Blawat’scoworker,Ialsofeelproudthatheissharinghisknowledgewiththeworld—notonlysootherscanbenefitfromhisexperience,butsotheycanseewhatthose

  • ofuswhoworkwithhimatCDWwitnessonadailybasis.

    PowerShellhasproventobeanincrediblyusefultoolforITadministratorssinceitburstontothescene.NowthereisabookaboutPowerShellthatwillproveequallyuseful.

    JonStevens

    ChiefInformationOfficer

    CDW

  • AbouttheAuthorBrentonJ.W.Blawatisanentrepreneur,strategictechnicaladvisor,author,andseniorconsultant,whohasapassionfortheprocurementoftechnologyinprofit-basedorganizations.Heisbusiness-centricandtechnology-minded.Brentonhasmanyyearsofexperienceinbridgingthegapbetweentechnicalstaffanddecision-makersinseveralorganizations.Hetakesprideinhisabilitytoeffectivelycommunicatewithadiverseaudienceandprovidestrategicdirectionforlargeandsmallorganizationsalike.

    In2013,Brentonauthoredhisfirstbook,PowerShell3.0WMIStarter,PacktPublishing.ThisbookwasdesignedtobeastarterforthoseinterestedinmanipulatingWindowsManagementInstrumentationthroughtheuseofPowerShell3.0.Thisbookisavailableinallpopularbookstores,includingPacktPublishing’swebsite,http://bit.ly/18pcpGK.

    BrentoncurrentlyworksatCDWasaseniorconsultingengineerinstrategicsolutionsandservices.CDWisaleadingmultibrandtechnologysolutionsproviderinthefieldsofbusiness,government,education,andhealthcare.AFortune500company,itwasfoundedin1984andemploysapproximately7,200coworkers.In2014,thecompanygeneratednetsalesofmorethan$12.0billion.FormoreinformationaboutCDW,youcanvisitwww.CDW.com.

    Iwouldliketothanktheforewordcoordinationteam,MaryViola,ScottThomas,JimmyThomson,BrandonKing,SondraRagusin,MeredithBraselman,andBillGlanz.Iwouldliketodedicatethisbooktomybeautifulnieces,CaliettandEvie.

    http://bit.ly/18pcpGKhttp://www.CDW.com

  • AbouttheReviewersTimAmicoisaconsultingengineeratCDW,whospecializesinConfigurationManagerandOperatingSystemDeployment.HestartedhiscareerinITbackin1998,whenheworkedasaconfigurationtechforCompuCom,learningaboutwhatisrequiredtobecomeanITprofessional.Sincethen,hehasclimbedtheladderfromhardwarefieldsupportandsoftwaredeploymentsupporttohiscurrentrole(forthelast10years)asanITconsultant,designingandimplementingendpointandmobilitymanagementsolutions.ApartfromConfigurationManagerandOSD,TimalsohasexperienceinPowerShell,BitLockerdriveencryptiondeployments,IntelvProprovisioningandusecasedesign,ActiveDirectory(bothinAzureandWindowsServer),SQLdesignandreporting,PKIdesign,andMicrosoftIntune.

    ChristopheCRÉMONisaSharePointinfrastructurearchitect,with10yearsofexperienceininformationtechnology,especiallyMicrosoft.HehasbeenusingPowerShellsince2008,andhaspublishedusefulscriptsandmodulesforITAdministratorsatpowershell.codeplex.com.Hehasapersonalwebsiteatwww.christophecremon.com.

    TomasRestrepohasbeenwritingsoftwareforover10years,startingwithC/C++andeventuallymovingtothe.NETplatform.Hecurrentlyspendsmostofhistimehelpingotherdeveloperssolvecomplexproblemsandtroubleshootingapplicationperformanceandscalabilityissues.

    http://powershell.codeplex.comhttp://www.christophecremon.com

  • www.PacktPub.com

  • Supportfiles,eBooks,discountoffers,andmoreForsupportfilesanddownloadsrelatedtoyourbook,pleasevisitwww.PacktPub.com.

    DidyouknowthatPacktofferseBookversionsofeverybookpublished,withPDFandePubfilesavailable?YoucanupgradetotheeBookversionatwww.PacktPub.comandasaprintbookcustomer,youareentitledtoadiscountontheeBookcopy.Getintouchwithusatformoredetails.

    Atwww.PacktPub.com,youcanalsoreadacollectionoffreetechnicalarticles,signupforarangeoffreenewslettersandreceiveexclusivediscountsandoffersonPacktbooksandeBooks.

    https://www2.packtpub.com/books/subscription/packtlib

    DoyouneedinstantsolutionstoyourITquestions?PacktLibisPackt’sonlinedigitalbooklibrary.Here,youcansearch,access,andreadPackt’sentirelibraryofbooks.

    http://www.PacktPub.comhttp://www.PacktPub.commailto:[email protected]://www.PacktPub.comhttps://www2.packtpub.com/books/subscription/packtlib

  • Whysubscribe?FullysearchableacrosseverybookpublishedbyPacktCopyandpaste,print,andbookmarkcontentOndemandandaccessibleviaawebbrowser

  • FreeaccessforPacktaccountholdersIfyouhaveanaccountwithPacktatwww.PacktPub.com,youcanusethistoaccessPacktLibtodayandview9entirelyfreebooks.Simplyuseyourlogincredentialsforimmediateaccess.

    http://www.PacktPub.com

  • InstantupdatesonnewPacktbooksGetnotified!Findoutwhennewbooksarepublishedbyfollowing@PacktEnterpriseonTwitterorthePacktEnterpriseFacebookpage.

  • PrefacePowerShellisanetworkscriptinglanguagethatprovidesasetoftoolstoadministerMicrosoftproducts.WhilePowerShellisbasedoncommand-lineinteractions,itismuchmorepowerfulthanwhatthestandardcommandlineoffers.Ithasbuilt-insectionsofcodecalledcmdlets.Theysimplifyfunctionsthatyoumayneedtoperformonasystem.Usingcmdletsgreatlyreducesthenumberoflinesofcodethatarerequiredtoperformactions,comparedtootherscriptinglanguages,suchasVBScript.

    PowerShellisbasedontheverb-nounnamingconvention,whichallowsscripterstodeclareanactionfollowedbyanobjecttoconfigure.Forexample,theget-servicecmdleteasilydesignatesthatyouaregettingaWindowsservice.ThisliteralnamingconventionhelpsreadersquicklylearnhowtoprograminPowerShell,astheactionsareeasilyremembered.

    CommunitysupportforPowerShellhasgrownastronomically.NotonlyhavelargecompaniesadoptedPowerShellintheirenvironments,butuniversitiesarealsoregularlyteachingPowerShellcoursestotheirstudents.PowerShell’sfeaturesetkeepsgrowingwitheveryreleaseoftheproduct.Itisconceivableinthenearfuturethatyouwillbeabletofullyautomatetheconfigurationofeverycomponentinadatacenter.Thiswillremovetheneedsofmultipleengineeringspecialiststoprovisionnetworking,storage,firewalls,operatingsystemsbuilds,andhigh-availabilityconfigurations.ItwillallbedoneviaPowerShellscriptingandthesystemswillbeabletobeconfiguredusingasingularnetworklanguage.

    ThisbookprovidesastrongfoundationforlearningPowerShellusingreal-worldscenarios.Youwillnotonlybeabletoquicklylearnhowtoprograminthislanguage,butalsobeabletoproducescriptsthatyoucanuseinyourexistingenvironments.Thisbookwillalsobeagreatreferencebookforyoutolookbackonandrevisitasyouarecoding.Itwillprovidethepropersyntaxandshowyousuccessfulwaystoimplementyourcode.Whenyouaredonewithreadingthisbook,youwillbewellonyourwayto“masteringPowerShell”!

  • WhatthisbookcoversChapter1,Variables,Arrays,andHashes,exploresthedifferentdataandobjectcontainersthatyoucanuseinPowerShell.Thesecontainersincludevariables,arrays,andhashes.Thischapterprovidesexamplesonhowtousethesecontainerstostoreobjects.

    Chapter2,DataParsingandManipulation,divesintothedifferentdatatypesandhowtomanipulatetheminyourscripts.Thesedatatypeexamplesincludestrings,integers,dates,XML,andmanymore.

    Chapter3,ComparisonOperators,evaluatesmultiplecomparisonoperatorsanddisplayshowtouseeachofthesecomparisonoperators.Thischapteralsodisplayshowtoleverageimpliedtrueandfalsecomparisonoperators.

    Chapter4,Functions,Switches,andLoopsStructures,displaystheuseofdifferentdatastructurestoperformrepeatableactions.Itprovidesexamplesonhowtoparselargearraysofdatathroughloopingstructuresandhowtoincludeoverloadparametersinthesestructures.

    Chapter5,RegularExpressions,exploresPowerShell’simplementationofregularexpressions.Itevaluatesthebuilt-incomparisonoperatorsthatprovideexpressionvalidationandhowtocreatecomplexexpressions.

    Chapter6,ErrorandExceptionHandlingandTestingCode,showsyouhowtocreatecodeinarobustmannertoavoidexceptionsduringexecution.Thischapterexplainsvariousbuilt-inerrorandexceptionhandlingtechniques,aswellassupportforlegacysystemsthatdon’tsupportPowerShellcmdlettriggers.Italsoexplainsthedifferentitemstobeawareofduringthetestingcycleofyourcode.

    Chapter7,Session-basedRemoteManagement,providesaninsightintosession-basedmanagementthroughPowerShell.Itdisplayshowtoleveragethebuilt-inWinRMtoexecuteitemsonremotesystems.

    Chapter8,ManagingFiles,Folders,andRegistryItems,displayshowtoquery,create,modify,anddeleteitemsinthefilesystemandregistry.Thisincludesfiles,folders,registrykeys,registry-namedvalues,andproperties.

    Chapter9,File,Folder,andRegistryAttributes,ACLs,andProperties,divesdeepintotheinterworkingoffiles,folders,andregistries.Thischapterexplainshowtosetfileandfolderstandardsandadvancedattributes.ItalsodisplayshowtomanipulateACLstosetpermissionsonfiles,folders,andregistryitems.

    Chapter10,WindowsManagementInstrumentation,explainshowtouseWindowsManagementInstrumentation(WMI)toquerylocalandremotesystemsforadvancedsysteminformationandthedifferentcmdletsthatprovideaccesstoasystem’sWMI.

    Chapter11,XMLManipulation,exploreseXtensibleMarkupLanguage(XML)andshowsyouhowtointeractwithitusingPowerShell.ThischapterexplainsthedifferentcomponentsthatmakeupaproperXMLdocumentandhowtointeractwiththeseindividualcomponents.

  • Chapter12,ManagingMicrosoftSystemswithPowershell,providesinformationonhowtoworkwithWindowsusersandgroups,Windowsservices,Windowsprocesses,andthemanipulationofWindowsfeaturesandroles.

    Chapter13,AutomationoftheEnvironment,explainshowtoinvokeitemsforusewithautomationscripts.Thischapterexplainsparentandchildrelationshipsbecausetheypertaintolinkingscriptstogether.ItalsoexploresDesiredConfigurationManagement(DCM)andconfigurationbaselines.

    Chapter14,ScriptCreationBestPracticesandConclusion,providesbestpracticerecommendationsforutilizingPowerShellinyourenvironment.Thischapterconcludeswithsomefinalthoughtsfromtheauthor.

  • WhatyouneedforthisbookToworkthroughtheexamplesprovidedinMasteringWindowsPowerShellScripting,youwillneedaccesstoWindows7orahigherWindowsoperatingsystem.YouwillalsoneedServer2008R2orahigherWindowsServeroperatingsystem.ThechaptersinthisbookrelyhighlyonWindowsManagementFramework4.0(PowerShell4.0)andRemoteServerAdministrationTools.Youwillneedtodownloadandinstallbothofthesesoftwarepackagesonthesystemsyouarerunningtheseexampleson.

  • WhothisbookisforMasteringWindowsPowerShellScriptinghasbeendesignedforPowerShellscripterswhocanbebothbeginnersandadvanced-levelcoders.Byreadingthisbook,youwillbeabletogainin-depthknowledgeofPowerShellandthebestpracticestodevelopscriptsusingthisautomationlanguage.Previousscriptingandcodingexperiencewillbehelpful,thoughitisnotrequired.

  • ConventionsInthisbook,youwillfindanumberofstylesoftextthatdistinguishbetweendifferentkindsofinformation.Herearesomeexamplesofthesestyles,andanexplanationoftheirmeaning.

    Codewordsintext,databasetablenames,foldernames,filenames,fileextensions,pathnames,dummyURLs,userinput,andTwitterhandlesareshownasfollows:“Theget-servicecmdletisusedtoretrievedetailedinformationaboutWindowsservices.”

    Anycommand-lineinputoroutputiswrittenasfollows:

    #Retrievetheservicesstatusandstarttheserviceifitisstopped.$status=(Get-service–DisplayName"WindowsAudio").StatusIf($status–like"Stopped"){start-service–DisplayName"WindowsAudio"}

    Newtermsandimportantwordsareshowninbold.Wordsthatyouseeonthescreen,inmenusordialogboxesforexample,appearinthetextlikethis:“Toaddafirewallruleonasystemusingthenetshcommand,youneedtoopenPowerShellwiththeRunasAdministratoroption”

    NoteWarningsorimportantnotesappearinaboxlikethis.

    TipTipsandtricksappearlikethis.

  • ReaderfeedbackFeedbackfromourreadersisalwayswelcome.Letusknowwhatyouthinkaboutthisbook—whatyoulikedormayhavedisliked.Readerfeedbackisimportantforustodeveloptitlesthatyoureallygetthemostoutof.

    Tosendusgeneralfeedback,simplysendane-mailto,andmentionthebooktitleviathesubjectofyourmessage.

    Ifthereisatopicthatyouhaveexpertiseinandyouareinterestedineitherwritingorcontributingtoabook,seeourauthorguideonwww.packtpub.com/authors.

    mailto:[email protected]://www.packtpub.com/authors

  • CustomersupportNowthatyouaretheproudownerofaPacktbook,wehaveanumberofthingstohelpyoutogetthemostfromyourpurchase.

  • DownloadingtheexamplecodeYoucandownloadtheexamplecodefilesforallPacktbooksyouhavepurchasedfromyouraccountathttp://www.packtpub.com.Ifyoupurchasedthisbookelsewhere,youcanvisithttp://www.packtpub.com/supportandregistertohavethefilese-maileddirectlytoyou.

    http://www.packtpub.comhttp://www.packtpub.com/support

  • ErrataAlthoughwehavetakeneverycaretoensuretheaccuracyofourcontent,mistakesdohappen.Ifyoufindamistakeinoneofourbooks—maybeamistakeinthetextorthecode—wewouldbegratefulifyouwouldreportthistous.Bydoingso,youcansaveotherreadersfromfrustrationandhelpusimprovesubsequentversionsofthisbook.Ifyoufindanyerrata,pleasereportthembyvisitinghttp://www.packtpub.com/submit-errata,selectingyourbook,clickingontheerratasubmissionformlink,andenteringthedetailsofyourerrata.Onceyourerrataareverified,yoursubmissionwillbeacceptedandtheerratawillbeuploadedonourwebsite,oraddedtoanylistofexistingerrata,undertheErratasectionofthattitle.Anyexistingerratacanbeviewedbyselectingyourtitlefromhttp://www.packtpub.com/support.

    http://www.packtpub.com/submit-erratahttp://www.packtpub.com/support

  • PiracyPiracyofcopyrightmaterialontheInternetisanongoingproblemacrossallmedia.AtPackt,wetaketheprotectionofourcopyrightandlicensesveryseriously.Ifyoucomeacrossanyillegalcopiesofourworks,inanyform,ontheInternet,pleaseprovideuswiththelocationaddressorwebsitenameimmediatelysothatwecanpursuearemedy.

    Pleasecontactusatwithalinktothesuspectedpiratedmaterial.

    Weappreciateyourhelpinprotectingourauthors,andourabilitytobringyouvaluablecontent.

    mailto:[email protected]

  • QuestionsYoucancontactusatifyouarehavingaproblemwithanyaspectofthebook,andwewilldoourbesttoaddressit.

    mailto:[email protected]

  • Chapter1.Variables,Arrays,andHashesPowerShellprovidesavarietyofmechanismstostore,retrieve,andmanipulatedatausedinyourscripts.Thesestorage“containers”arereferredtoasvariables,arrays,andhashes.Theycanbeusedascontainerstostorestrings,integers,orobjects.Thesecontainersaredynamicastheyautomaticallydetectwhattypeofdataisbeingplacedwithinthem.Unlikeotherobject-orientedlanguages,thereisnoneedtodeclarethecontainerpriortouse.Todeclareoneofthesecontainers,youusethedollarsign($)andthecontainername.

    Anexampleofacontainerwouldlooklikethis:

    $myVariable

    Duringthischapter,youwilllearnthefollowingconcepts:

    VariablesArraysHashesDecidingthebestcontainerforyourscripts

    Whenyouarecreatingnamesforcontainers,itisindustrybestpracticetousenamesthatarerepresentativeofthedatatheyarestoring.WhilecontainersarenotcasesensitiveinPowerShell,itisacommonpracticetousecamelCasewhenwritingcontainernames.camelCaseisachievedbykeepingthefirstletterofthecontainerlowercaseandthesubsequentfirstlettersofeachwordcapitalized.SomevariationsofcamelCasepermitthefirstlettertobecapitalized.Thisformattingaidsineasyreadingofthecontainers.

    AnexampleofacontainerusingcamelCasewouldlooklikethis:

    $webServerIPAddress

  • VariablesVariablesareoneofthemostwidelyusedcontainersinPowerShellduetotheirflexibility.Avariableisacontainerthatisusedtostoreasinglevalueoranobject.Variablescancontainavarietyofdatatypesincludingtext(string),numbers(integers),oranobject.

    Ifyouwanttostoreastring,dothefollowing:

    $myString="MyStringHasMultipleWords"$myString

    Theoutputofthisisshowninthefollowingscreenshot:

    TheprecedingvariablewillnowcontainthewordsMyStringHasMultipleWords.Whenyououtputthe$myStringvariable,asshownintheprecedingscreenshot,youwillseethatthestringdoesn’tcontainthequotations.ThisisbecausethequotationstellthePowerShellcommand-lineinterpretertostorethevaluethatisbetweenthetwopositionsorquotations.

    TipYouareabletoreusevariableswithoutdeletingthecontentalreadyinsidethevariable.ThePowerShellinterpreterwillautomaticallyoverwritethedataforyou.

    Subsequently,ifyouwanttostoreanumber,dothefollowing:

    $myNumber=1$myNumber

    Theoutputofthisisshowninthefollowingscreenshot:

    Thismethoddifferentiateswhilestoringastringasyoudonotusequotations.ThiswilltellthePowerShellinterpretertoalwaysinterpretthevalueasanumber.Itisimportanttonotusequotationswhileusinganumber,asyoucanhaveerrorsinyourscriptifthePowerShellinterpretermistakesanumberforastring.

    Anexampleofwhathappenswhenyouusestringsinsteadofintegerscanbeseenhere:

    $a="1"$b="2"$c=$a+$b$c

  • Theoutputofthisisshowninthefollowingscreenshot:

    The$cvariablewillcontainthevalueof12.ThisisduetoPowerShellinterpretingyour$astringof1and$bstringof2andputtingthecharacterstogethertomake12.

    Thecorrectmethodtodothemathwouldlooklikethis:

    $a=1$b=2$c=$a+$b$c

    Theoutputofthisisshowninthefollowingscreenshot:

    Sincethe$aand$bvariablesarestoredasnumbers,PowerShellwillperformthemathonthenumbersappropriately.The$cvariablewillcontainthecorrectvalueof3.

  • ObjectsstoredinvariablesObjectsarevastlydifferentthanstringsandnumbers.ObjectsinPowerShellaredatastructuresthatcontaindifferentattributessuchaspropertiesandmethodswithwhichonecaninteract.Objectpropertiesaredescriptorsthattypicallycontaindataaboutthatobjectorotherrelatedobjects.Objectmethodsaretypicallysectionsofcodethatallowyoutointeractwiththatobjectorotherobjectsonasystem.Theseobjectscaneasilybeplacedinvariables.Youcansimplyplaceanobjectinavariablebydeclaringavariableandplacinganobjectinit.Toviewalloftheobject’sattributes,youcansimplycallthevariablecontainingtheobject,useapipecharacter|,andusetheget-membercmdlet.

    Toplaceanobjectinavariableandretrieveitsattributes,youneedtodothis:

    $date=get-date$date$date|get-member

    Theoutputisshowninthefollowingscreenshot:

    Inthisexample,youwilllearnhowtoplaceanobjectintoavariable.Youfirststartbydeclaringthe$datevariableandsettingitequaltotheoutputfromtheget-datecmdlet.Whenyouexecutethis,theget-datecmdletreferencestheSystem.Dateclass,andthe$datevariableinheritsallofthatobject’sattributes.Youthencallthe$datevariableandyouseethattheoutputisthedateandtimefromwhenthatcommandwasrun.Inthisinstance,itisdisplayingtheDateTimeScriptPropertyattributeonthescreen.ToviewalloftheattributesoftheSystem.Dateobjectinthe$datevariable,youpipethoseresultstotheget-membercmdlet.Youwillseealloftheattributesofthatobjectdisplayedonthescreen.

    Ifyouwanttousethepropertiesandmethodattributesofthatobject,youcansimplycallthemusingdotnotation.Thisisdonebycallingthevariable,followedbyaperiod,and

  • referencingthepropertyormethod.

    Toreferenceanobject’spropertiesandmethodattributes,youneedtodothis:

    $date=get-date$date.Year$date.addyears("5")

    Theoutputofthisisshowninthefollowingscreenshot:

    Thisexampleshowsyouhowtoreferenceanobject’spropertiesandmethodattributesusingdotnotation.Youfirststartbydeclaringthe$datevariableandsettingitequaltotheoutputfromtheget-datecmdlet.Whenyouexecutethis,theget-datecmdletreferencestheSystem.Dateclass,andthe$datevariableinheritsallofthatobject’sattributes.YouthenleveragedotnotationtoreferencetheYearpropertyattributebycalling$date.Year.Theattributewillreturn2015astheYearproperty.YouthenleveragedotnotationtousetheAddYears()methodtoincreasetheyearsby5.Afterenteringthe$date.addyears("5")command,youwillseeanoutputonthescreenofthesamemonth,day,andtime;however,theyearisincrementedby5years.

  • ArraysArraysarethesecondmostusedcontainersinPowerShell.Anarray,insimpleterms,isamulti-dimensionalvariableoravariablecontainingmorethanonevalue.Thetwocorecomponentstoanarrayaretheindexnumberandthepositionvalue.Whenyouuseanarray,youreferenceanindexnumberanditwillreturnthepositionvalue.

  • Single-dimensionarraysThefollowingtablerepresentsanarraywithasingledimension:

    Indexnumber Positionvalue

    0 Example1

    1 Example2

    2 Example3

    3 Example4

    4 Example5

    Whenyouarestoring,manipulating,orreadingthedatainanarray,youhavetoreferencethepositioninthearraythedataisresiding.Thenumberspopulatedinthetable’sIndexnumbercolumnarerepresentativeofthelocationwithinthearray.Youwillseethatarray’snumberingstartsatthenumber0,andsothefirstdatawouldbeincell0.Ifyoucallthearrayatposition0,theresultwouldbethepositionvalueofExample1.Whenbuildingthearray,youwillseethateachvalueinthearrayvaluesisseparatedbyacomma.ThistellsthePowerShellinterpretertosetanewarrayvalue.

    First,youcanstartbybuildingthearrayintheprecedingtablebyenteringthefollowingcommand:

    $myArray="Example1","Example2","Example3","Example4","Example5"$myArray

    Theoutputofthisisshowninthefollowingscreenshot:

    Theprecedingexampledisplayshowtocreateanarrayofstrings.Youfirststartbydeclaringavariablenamed$myArray.Youthenplacemultiplestringsoftextseparatedbycommastobuildthearray.Afterdeclaringthearray,youcallthe$myArrayarraytoprintthevaluestotheconsole.ItwillreturnExample1,Example2,Example3,Example4,andExample5.

    Retrievingdataataspecificpositioninanarrayisdonethroughtheuseofbrackets.Toretrievethevalueof0fromthearray,youwoulddothefollowing:

    $myArray="Example1","Example2","Example3","Example4","Example5"$myArray[0]

    Theoutputofthisisshowninthefollowingscreenshot:

  • Theprecedingexampledisplayshowyoucanobtainarraydataataspecificposition.Youfirststartbydeclaringavariablenamed$myArray.Youthenplacemultiplestringsoftextseparatedbycommastobuildthearray.Afterdeclaringthearray,youcall$myArray[0]toaccessthepositionvalueofindexnumber0fromthearray.TheprecedingexamplereturnsthevalueofExample1fortheindexnumber0.

  • JaggedarraysArrayscanbecomemorecomplexasyoustartaddingdimensions.Thefollowingtablerepresentsajaggedarrayoranarrayofarrays:

    Indexnumber Positionvalue0 Positionvalue1

    0 Example1 Red

    1 Example2 Orange

    2 Example3 Yellow

    3 Example4 Green

    4 Example5 Blue

    Whileaccessingdatainajaggedarray,youwillneedtoreadthecellvaluescountingat0forbothdimensions.Whenyouareaccessingthedata,youstartreadingfromtheindexnumberfirstandthenthepositionvalue.Forexample,theExample1dataisintheindexnumberof0andthepositionvalueof0.Thiswouldbereferencedasposition[0][0].Subsequently,thedataBlueisintheindexnumberof4andpositionvalueof1.Thiswouldbereferencedasposition[4][1].

    Todothisforyourself,youcanbuildtheprecedingtablebyenteringthefollowingcommand:

    $myArray=("Example1","Red"),("Example2","Orange"),("Example3","Yellow"),("Example4","Green"),("Example5","Blue")$myArray[0][0]$myArray[4][1]

    Theoutputisshowninthefollowingscreenshot:

    Thisexampledisplayshowtocreateajaggedarrayandaccessingvaluesinthearray.Youfirststartbuildingthejaggedarraybydeclaringthefirstarrayof"Example1""Red",secondarrayof"Example2""Orange",thirdarrayof"Example3""Yellow",fourtharrayof"Example4""Green",andfiftharrayof"Example5""Blue".Afterbuildingthearray,youaccessthewordExample1byreferencing$myArray[0][0].YouthenaccessthewordBluebyreferencing$myArray[4][1].

  • UpdatingarrayvaluesAfteryoucreateanarray,youmayneedtoupdatethevaluesinsidethearrayitself.Theprocessforupdatingvaluesinanarrayissimilartoretrievingdatafromthearray.Firstyouneedtofindthecelllocationthatyouwanttoupdate,andthenyouneedtosetthatarraylocationasequaltothenewvalue:

    Indexnumber Positionvalue0 Positionvalue1

    0 John Doe

    1 Jane Smith

    Giventheprecedingtable,ifJane’slastnameneededtobeupdatedtodisplayDoeinsteadofSmith,youwouldfirstneedtolocatethatdatarecord.Thatincorrectlastnameislocatedatindexnumber1andpositionvalue1,or[1][1].Youwillthenneedtosetthatdatalocationequal(=)toDoe.

    Todothis,youneedtoenterthefollowingcommand:

    $myArray=("John","Doe"),("Jane","Smith")$myArray$myArray[1][1]="Doe"$myArray

    Theoutputofthisisshowninthefollowingscreenshot:

    Thisexampledisplayshowyoucancreateanarrayandupdateavalueinthearray.Youfirststartbydefining$myArrayanduse"John","Doe","Jane",and"Smith"asthearrayvalues.Aftercallingthevariabletoprintthearraytothescreen,youupdatethevalueinindexnumber1,positionvalue1,or$myArray[1][1].BysettingthispositionequaltoDoe,youchangethevaluefromSmithtoDoe:

    Indexnumber Positionvalue0 Positionvalue1

    0 John Doe

    1 Jane Smith

    2 Sam Smith

  • Ininstanceswhereyouwanttoappendadditionalvaluestothearray,youcancallthearrayvariablewiththe+=commandandthedatayouwanttoaddtothearray.Thislookslike$array+="NewArrayValues".The+=commandisamoreefficientmethodofperformingthecommands$array=$array+"NewArrayValues".

    Toadddataintoanarrayandmaketheprecedingtable,youcandothefollowingoperation:

    #CreatetheArray$myArray=("John","Doe"),("Jane","Smith")$myArray#AppendDatatotheArray$myArray+=("Sam","Smith")$myArray

    Theoutputofthisisshowninthefollowingscreenshot:

    Inthisexample,youaddvaluestoanexistingarray.Youfirststartbydefininganarrayof$myArray.Youthenprinttheexistingcontentsofthearraytothescreen.Youthenaddadditionalcontentbysettingthearray+=tothenewarraydataof("Sam","Smith").Afterreprintingthecontentsofthearraytothescreen,youseethevaluesSamandSmithaddedtothearray.

    TipTosearchandremoveitemsfromanarray,youwillneedtocreateaForEachlooptocyclethroughalloftheindexnumbersandpositionvalues.Chapter4,Functions,Switches,andLoopStructures,explorestheForEachloopingstructure.

  • HashesHashesareusedlikearrays.Themaindifferenceisthattheyusethevaluesasindexesversussequentiallynumberedindexes.Thisprovideseasyfunctionalitytoadd,remove,modify,andfinddatacontainedinthehashtable.Hashtablesareusefulforstaticinformationthatneedsadirectcorrelationtootherdata:

    Name Value

    John.Doe Jdoe

    Jane.Doe jdoe1

    AgoodexampleofahashtablewouldbeintheinstanceofanActiveDirectorymigration.InmostActiveDirectorymigrations,youwouldneedtocorrelateoldusernamestonewusernames.Theprecedingtablerepresentsausernamemappingtableforthesetypesofmigrations.Whileatraditionalarraywouldwork,ahashtablemakesthismucheasiertodo.

    Tocreatetheprecedinghashtable,enterthefollowingcommand:

    $users=@{"john.doe"="jdoe";"jane.doe"="jdoe1"}$users

    Theoutputofthisisshowninthefollowingscreenshot:

    Afteryoucreatethetable,youmaywanttofindaspecificuser.Youcansearchahashtablebyusingthehash’sindexingfunction.Thisisdonebycalling$hashName["value"].Anexampleofthiswouldlooklikethefollowingcommand:

    $users=@{"john.doe"="jdoe";"jane.doe"="jdoe1"}$users["john.doe"]

    Theoutputofthisisshowninthefollowingscreenshot:

    Afterenteringthecommand,youwillseethat$users["john.doe"]returnsjdoeasthecorrelatingvalueinthehash.

    Oneofthemostpopularmethodstousewithhashtablesistheaddmethod.Theadd

  • methodallowsyoutoenternewvalueswithinthehashtable.Youcanusethiswhilebuildingthehashtable,asmosthashtablesarebuiltwithinascript.Ifyouwanttoaddanotherusertothehashtable,usetheaddmethodasshownhere:

    $users=@{"john.doe"="jdoe";"jane.doe"="jdoe1"}$users$users.add("John.Smith","jsmith")$users

    Theoutputofthisisshowninthefollowingscreenshot:

    YouwillseethatJohn.Smithwiththevalueofjsmithisnowaddedtothehashtable.

    Youcanalsoupdatevaluesinahashbyleveragingthehash’sindex.Thisisdonebysearchingforavalueandthensettingitscorrelatinghashvalueequaltoanewvalue.Thislookslike$arrayName["HashIndex"]="Newvalue".Anexampleofthisisgivenhere:

    $users=@{"john.doe"="jdoe";"jane.doe"="jdoe1"}$users$users["jane.doe"]="jadoe"$users

    Theoutputofthisisshowninthefollowingscreenshot:

    YouwillseethatthemappedvalueforJane.Doenowreadsjadoe.Thisisvastlydifferent

  • fromanarray,whereyouwouldhavetosearchforaspecificvaluelocationtoreplacethevalue.

    Ifyouwanttoremoveauserfromthehashtable,usetheremovemethod,asshownhere:

    $users=@{"john.doe"="jdoe";"jane.doe"="jdoe1"}$users$users.remove("Jane.Doe")$users

    Theoutputofthisisshowninthefollowingscreenshot:

    YouwillseethatJane.Doeisnowremovedfromthehashtable.Thismethodishelpfulwhenyouneedtoremovespecificvalues,whichmeetcertaincriteria,fromthehashtable.

  • DecidingthebestcontainerforyourscriptsWhenyouarescripting,itisimportanttoputconsiderationintowhatkindofcontaineryouwillbeusing.Sometimesthesimplicityofcreatingasingularvariableandupdatingthatvariableislesscomplexthancreatinganarrayorhashtabletosearchthrough.Atothertimes,itmaybemoreefficienttopullthewholedatasetanduseindividualpiecesofthatdatawithinyourscript.

    Single-linevariablescanbeusedfor:

    MathoperationsthatrequirecalculationsofsingleormultiplevaluesCatchingsingle-lineoutputfromexecutinganon-PowerShellcommandTrackingcurrentpositioninalooplike“percentcomplete”

    Arraysarebestusedfor:

    StoringalistofitemsforindividualprocessingwithinascriptDumpingerrorinformationfromaPowerShellcmdlet

    Hashesarebestusedfor:

    MappingdatafromonevaluetoanothervalueDatathatrequiresfrequentsearching,updating,orbuildingduringscriptexecutionStoringmultiplevaluesofcorrelateddatalikeuserobjectattributes

  • SummaryThischapterexplorestheuseofavarietyofcontainers.Youlearnedthatvariables,arrays,andhasheshavethecommonalityofbeingabletostoredata,buttheydoitindifferentways.Youlearnedthatdifferenttypesofdatacanbestoredinthesecontainers.Thesetypesofdataincludenumbers,strings,andobjects.

    Thischapterexploredthatvariablesarebestusedforthestorageofsingle-dimensionaldatasets.ThesedatasetscancontainstringsbutalsoincludemathematicalequationsthatPowerShellhastheabilitytoinherentlycalculate.Youalsonowknowthatarraysareprimarilyusedinsituationswhereyouwanttostoremorethanonesetofdata.Youareabletonavigate,add,andremovevaluesinthearraybasedoffofastartingvalueof0.Last,youlearnedthathashesarebestusedwhilecorrelatingdatafromonevaluetoanother.Youareabletoadd,remove,andsearchdatacontainedinthehashtableswiththeuseofsimplecommands.Inthenextchapter,youwilllearntechniquestoperformdataparsingandmanipulationbyleveragingvariablesandarrays.

  • Chapter2.DataParsingandManipulationOneofthemostpowerfulfeaturesofPowerShellisitsabilitytoretrieveandmanipulatedata.ManyatimeswhenyouretrievedatafromaPowerShellsession,theformatinwhichitisavailableisdifferentfromwhatyouwouldwanttodisplayinthePowerShellwindoworinalogfile.Forthispurpose,PowerShellprovidespowerfulcmdletsandmethodstoperformdatamanipulationtobestsuityourneedsasaPowerShellscripter.

    Whilereadingthischapter,you’lllearnthefollowingconcepts:

    StringmanipulationNumbermanipulationandparsingDate/timemanipulationForcingdatatypesPowerShellpipeline

  • StringmanipulationStringmanipulationissomethingthatyou’llneedtodoinalmosteveryscriptyoucreate.Whilesomeofthestringmethodswillbeusedmoreoftenthanothers,theyallservedifferentpurposesforyourscript.Itisultimatelyuptoyourcreativityonhowyouwantdatatolookwhenitisdisplayedonthescreen.

    Tochangethetexttouppercase,executethefollowingcommand:

    $a="Error:Thisisanexampleerror"$a.toUpper()

    Theoutputofthisisshowninthefollowingscreenshot:

    ThetoUpper()methodisusedtoformatthetexttouppercase.Thisishelpfulinsituationswheremessagesneedtobeemphasizedorshouldstandout.Theresultofthiscommandwillchangethecase.

    Tochangethestringtolowercase,executethefollowingcommand:

    $string="TheMACAddressis"$mac="00:A0:AA:BB:CC:DD"$message=$string+$mac.toLower()$message

    Theoutputofthisisshowninthefollowingscreenshot:

    TheinverseoftoUpper()istheuseoftoLower().Thiscommandwillconverttheentirestringtolowercaseintheinstancewhenyoudonotwanttoemphasizeastring.toLower()istypicallyusedinsituationswhereasinglewordoravariableisuppercase,andyouwanttotransitionittolowercase.Thiscommandshowstakingtwoseparatestrings,formattingthe$MACstringtothelowercase,andoutputtingbothvariablestogether.

  • ReplacingandsplittingstringsPowerShellalsoprovidestheabilitytoreplacecharactersinstringsusingtheReplace()method.Thisisusefulwithinyourscriptswhenyouhavetoreplacecharactersfromtheoutputofanothermethod.Forinstance,ifyoupullalistofcommonusernamesfromActiveDirectory,theyareprefixedwithcn=.IfyouwantedtoreplaceCN=withnothing(""),youcaneasilyaccomplishthiswiththeReplace()method.

    Toreplaceitemsinastring,executethefollowingcommand:

    $usernames="CN=juser,CN=jdoe,CN=jsmith,CN=bwhite,CN=sjones"$usernames=$usernames.replace("CN=","")$usernames

    Theoutputofthisisshowninthefollowingscreenshot:

    ThisscriptwillreplacethecharactersCN=withnothingasdesignatedby"".Theoutputofthisscriptisalistofusernameswithcommaseparators.Asyoucansee,thisisveryhelpfulinthemanipulationofthedatabeingoutputfromActiveDirectory.Buildingonthepriorexample,ifyouwantedtoprocesstheusernamesindividually,youcanleveragethesplit()method.Thesplit()methodwillseparatevaluesinastring,bydeclaringaspecificcharactertosplit.

    Tosplititemsinastring,executethefollowingcommand:

    $usernames="juser,jdoe,jsmith,bwhite,sjones"$userarray=$usernames.split(",")$userarray

    Theoutputofthisisshowninthefollowingscreenshot:

    Whenyouleveragethesplit()method,asshowninthisexample,thescriptusesthecommaasdesignationthatthenextitemneedstobeanewvaluewithinthearray.Theoutputfromthisscriptallowsyoutointeractwiththeseusernamesindividually.Youwillfrequentlyusethesplit()methodwhileworkingwithcommaseparatedvalues(CSV)filesorXMLfiles.It’scommonforthesetypesoffilestocontainmultipleobjectsperline,whichmakessensetoleveragethesplit()method.

  • CountingandtrimmingstringsPowerShellhastwomethodstocountobjectswithinvariablesandarrays.ThefirstisdonebyusingtheCountmethod.TheCountmethodisusedtocountthenumberofobjectsthatarecontainedwithinanarray.Thisisusefulwhenyouareattemptingtodeterminethequantityofitemsyou’llbeprocessingwithinyourscript.

    Tocountitemsinanarray,executethefollowingcommand:

    $services=get-service$services.count

    Theoutputofthisisshowninthefollowingscreenshot:

    Agoodexampleofdetermininghowmanyobjectsarepresentinanarrayisobtainingthenumberofservicesrunningonasystem.ThepreviouscommanddisplaysaqueryoftheservicesonaboxandusestheCountmethodtoobtainthequantityofservices.Thesysteminthisexamplehas210services.

    Thesecondmethodtocountobjectsisusedforinstancesinyourscriptswhereyouneedtodeterminethelengthorthenumberofcharactersinastring.ThisiscompletedbyusingtheLengthmethod.TheLengthmethodwillcountthenumberofcharactersinastring,includingspaces,andoutputthequantityofcharacters.

    AcommonscenariowhereyouwouldusetheLengthmethodiswithWindowsfileandfolderpaths.SincetheWindowsoperatingsystemsarewellknownforhavingafilepathlimitationof255characters,wecanleveragetheLengthmethodtoqualifyincaseswherethepathisoverthatlimitation.

    Togetthelengthofastring,executethefollowingcommand:

    $path="c:\windows\system32\drivers\1394bus.sys"$path.length

    Theoutputofthisisshowninthefollowingscreenshot:

    Inthisexample,youarecountingthenumberofcharactersinafileandfolderpathtoensurethatyoudonotexceedthemaximumnumberofcharacters.Thiscommandcountedthelengthof$pathtobe39characters.Throughthiscommand,you’vedeterminedthatitisnotoverthelimitationsoftheWindowsoperatingsystem.

  • TheTrimmethodAsyouscript,you’llrunintosituationswheretheoutputfromacommandortheinputfromafilemaynotbeinaformatthatcanbeeasilyparsed.Forexample,ifyouimportvaluesfromaCSVfileandthosevalueshaveextraspaces,itcancauseyourscripttofail.PowerShellprovidestheabilitytotrimstringsofspacesandothercharacterswiththeTrim()method.TheTrim()methodcomesinthreedifferentvariations,whichareTrim(),TrimStart(),andTrimEnd().

    Totrimthespacesoutofastring,usethefollowingcommand:

    $csvValue="servername.mydomain.com"$csvValue.trim()

    Theoutputofthisisshowninthefollowingscreenshot:

    Bydefault,whenyouusetheTrim()methodwithoutdeclaringanycharacterstotrim,itwillautomaticallyremovethespacesthatsurroundthetextvaluesinastring.Thisexampledisplaysacomputernamethatissurroundedbyspaces.AfterrunningtheTrim()method,you’llseethatthespacesaresuccessfullytrimmedfromthestring.

    Totrimvaluesoutofastring,executethefollowingcommand:

    $csvValue="servername.mydomain.com"$csvValue=$csvValue.trim(".mydomain.com")$csvValue

    Theoutputofthisisshowninthefollowingscreenshot:

    Ifyouwanttotrimaspecificvaluefromastring,youcandeclareitwithintheTrim()method.Byexecutingtheprecedingscript,you’llseethatdeclaringatextvalueof.mydomain.comwithintheTrim()methodwillremovethosecharactersfromtheentirestring.

    TheTrimStart()methodprovidesthesamefunctionalityoftheTrim()method;however,itonlyremovescharactersfromthebeginningofthestring.Likewise,theTrimEnd()methodwillonlyremovecharactersfromtheendingofthestring.Thesearehelpfulinsituationswhereyouneedtoparsethedataintovaluesthatcanbereadeasily.

    Totrimthebeginningandendofastring,executethefollowingcommand:

    $csvValue="FQDN:servername.mydomain.com"

  • $csvValue=$csvValue.trimStart("FQDN:")$csvValue=$csvValue.trimEnd(".mydomain.com")$csvValue

    Theoutputofthisisshowninthefollowingscreenshot:

    TheprecedingexampledisplaystheuseofbothTrimStart()andTrimEnd()methods.Inthisexample,youtrimthe"FQDN:"charactersfromthestartofthestringand.mydomain.comfromtheendofthestring.Thefinaloutputofthisisservername.

    WhenyouusetheTrim()method,you’llwanttorememberthatitwillremoveallinstancesofthewordsfoundatthebeginningandendingofthestring.Ifyouusedcomputernameinsteadofservername,youwouldhavenoticedthattheoutputfromthemethodwouldhaveputername.TheTrim()methodwouldhavematchedthewordscomandremoveditfromthestring.ItisbesttousetheTrim()methodtoremovespacesandunneededcharactersinstrings.UsetheReplace()methodtoremoveseriesofstringssuchas.mydomain.com.

    Thiswouldlooklikethis:

    $csvValue="computername.mydomain.com"$csvValue.Trim("com")

    Theoutputofthisisshowninthefollowingscreenshot:

    TheprecedingexampledisplayshowtheTrim()methodwillremovestringsfromthefrontandtheendofastring.Youfirstneedtostartbydeclaringthe$csvValuevariableasequaltocomputername.mydomain.com.YouthenneedtoleveragetheTrim()methodonthevariablesearchingforthewordcom.You’llseethatthemethodtrimsboththebeginningcomandendcomonthestringitself.Theendresultisputername.mydomain.

  • TheSubstringmethodTheSubstring()methodisanotherstringmanipulatorwithinthePowerShelltoolset.Itisbasedontherequirementthatyoumaywanttoremovecharacterspresentatafixedpositionwithinastring.ThefollowingtabledisplaysthestringpositionsforthestringTESTING123.Likeanarray,thestringpositionstartscountingat0,asshownhere:

    Stringposition 0 1 2 3 4 5 6 7 8 9

    Stringvalue T E S T I N G 1 2 3

    Toobtainasubstringfromastring,executethefollowingcommand:

    $string="TESTING123"$string=$string.substring("7")$string

    Theoutputofthisisshowninthefollowingscreenshot:

    TheSubstring()methodisdesignedtoextractdatapresentatspecificlocationsinastring.Ifyouwantedtoextractthenumbers123fromtheprecedingtable,youcanusetheSubstring()methodreferencingthestartpositionof7.Alloftheremainingcharactersafterposition7willbedisplayedandtheoutputofthemethodis123.

    Toobtainasubstringrangefromastring,executethefollowingcommand:

    $string="TESTING123"$string=$string.substring("0","4")$string

    Theoutputofthisisshowninthefollowingscreenshot:

    TheSubstring()methodallowsyoutoenterasecondvaluewithinthemethod.Whilethefirstvaluedesignatesthestartposition,thesecondvaluedesignateshowmanycharactersafterthestartpositionyouwanttoinclude.Inthepreviousscriptexample,thescriptstartsatposition0andcounts4spacesafterthepositionof0.TheresultofthiscommandisTEST.

  • ThestringtrueandfalsemethodsPowerShellhasbuilt-instringsearchingcapabilitiesthatprovideyouwiththeabilitytoquicklydeterminewhetherastringcontainsaspecificvalue.ThethreemethodsthatcanperformthesearchinginastringareContains(),Startswith(),andEndswith().Allofthesemethodsarebasedonthesameprinciple,thatis,findingaspecificvalueandreportingTrueorFalse.

    Toseewhetherastringcontainsavalue,dothis:

    $ping=pingThisDoesNotExistTesting.com–r1$ping$deadlink=$ping.contains("Pingrequestcouldnotfindhost")$deadlink

    Theoutputofthisisshowninthefollowingscreenshot:

    Thisexampleleveragesthepingcommandtodeterminewhetheraspecificwebsiteorhostisalive.Inourexample,youcapturethepingcommandinthe$pingvariable.YouthensearchthatvariablefortextthatmatchesPingrequestcouldnotfindhost.Astheoutputfromthepingcommandreturnsthevalueyouarelookingfor,theContains()methodwillreturnTrueandthe$deadlinkvariableissettoTrue.

    Toseewhetherastringstartswithavalue,executethefollowingcommand:

    $ping=pingThisDoesNotExistTesting.com–r1$ping$deadlink=$ping.StartsWith("Pingrequestcouldnotfindhost")$deadlink

    Theoutputofthisisshowninthefollowingscreenshot:

    WhenyourunthesamescriptwiththeStartswith()method,itwillreturnthesameresultofTrue.ThatisbecausethevaluethatyouaresearchingforstartswithPingrequestcouldnotfindhost.

    Toseewhetherastringendswithaspecificvalue,executethefollowingcommand:

    $ping=pingThisDoesNotExistTesting.com–r1$ping

  • $deadlink=$ping.EndsWith("Pleasecheckthenameandtryagain.")$deadlink

    Theoutputofthisisshowninthefollowingscreenshot:

    WhenyourunasimilarscriptwiththeEndswith()method,itwillreturntheresultofTrue.ThatisbecausethevaluethatyouaresearchingforendswithPleasecheckthenameandtryagain.

  • NumbermanipulationandparsingPowerShellisapowerfulmathematicscalculator.Infact,PowerShellhasanentireWindowsclassdedicatedtomathematicscalculationsthatcanbecalledbyusingthe[System.Math].NETclass.Whenyouareworkingwiththe[System.Math]classes,itiscommontocallstaticfieldswithinaclass.Staticfieldsarestaticproperties,methods,andobjectsthatcanbecalledtodisplaydataordoactions.Tocallastaticfield,youcallthe[Math](shortenedversionof[System.Math])class,followedbytwocolons::andthestaticfieldname.

    Tousethemathoperationtocalculatepi,executethefollowingcommand:

    [math]::pi

    Theoutputofthisisshowninthefollowingscreenshot:

    ThissimplecommandwillprovidePIifyoueverneeditforacalculationbyusingthepimethodofthemathclass.Theresultofthiscommandreturns3.14159265358979.

    TousethemathoperationtocalculateEuler’snumber,executethefollowingcommand:

    [math]::e

    Theoutputofthisisshowninthefollowingscreenshot:

    Likewise,ifyoueverneedtoreferenceEuler’sNumber(e),youcanachievethisbyleveragingtheemethodofthemathclass.Theresultofthiscommandreturns2.71828182845905.

    Tocalculatethesquarerootofanumber,executethefollowingcommand:

    [math]::sqrt("996004")

    Theoutputofthisisshowninthefollowingscreenshot:

    Ifyouneedtocalculatethesquarerootofalargenumber,youcanusethesqrtmethodofthemathclass.Theresultofthiscommandreturns998.

    Toroundanumber,executethefollowingcommand:

  • $number="214.123857123495731234948327312341657"[math]::Round($number,"5")

    Theoutputofthisisshowninthefollowingscreenshot:

    Roundingisverycommonforintegersinyourscripts.WhenyouwanttousetheRound()method,you’llhavetospecifyanumberandthenumberofdigitsyouwanttorounditto.Inthiscommand,youtakethenumberof214.123857123495731234948327312341657androundittothefifthdigit.Theresultofthiscommandreturns214.12386.

  • FormattingnumbersWhilePowerShellcanperformmathematicsverywell,itdoesnothaveanynativecommandsfortheformattingofnumbers.Inordertoformatnumbers,you’llneedtoleveragePowerShell’sabilitytousethe.NETFramework’sformattingmethods.Theconstructforthe.NETFrameworkformatmethodsiscalledbyspecifying"{StartingCharacter:FormatTypePrecision}"–f$variable.Thestartcharacteristhepositionwhereyouwanttostartformattingthenumber.Themostcommonformattypesarecurrency(C),decimal(D),numeric(N),percentage(P),andhexadecimal(X).Theprecisionfieldisthenumberofdecimalplacesyouwantthenumbertobeaccurateto.

    Toformatyournumberinanumericformatting,executethefollowingcommand:

    $number=12375134.132412"{0:N4}"–f$number

    Theoutputofthisisshowninthefollowingscreenshot:

    Inthisexample,youaretakingthe12375134.132412numberandformattingitinnumericformatstartingatthefirstcharacter.Thiscommandalsoroundsthenumbertothefourthdigit.

    Toformatanumbertomakeithexadecimal,executethefollowingcommand:

    $number=12375134$number="{0:X0}"–f$number$number

    Theoutputofthisisshowninthefollowingscreenshot:

    Ifyouwanttoconvertanintegertohexadecimal,youcanformattheintegertohexadecimalbyspecifying"{0:X0}"–f$number.TheoutputofthiscommandisBCD45E.Itisimportanttorememberthathexadecimalonlysupportsformattingfromwholenumbers.Ifyoudonotusewholenumbers,thescriptwillfailduetoitbeinginaninvalidformat.

  • FormattingbytesPowerShellhastheabilitytodirectlyconvertnumberstokilobytes(KB),megabytes(MB),gigabits(GB),andterabytes(TB)throughpredefinedaliasesforconversions.Thisishelpfulwhenyouarepullingdatavalues,whichbydefault,areformattedinbytes.Someofthesemayincludediskspaceandmemoryonasystem.Theuseofthealiasisnumberinbytesdividedbyoneunitofmeasure.

    ToformatbytestoKB,MB,GB,andTB,usethefollowingoperations:

    #16GBofMemoryinBytes$ComputerMemory=16849174528$ComputerMemory/1TB$ComputerMemory/1GB$ComputerMemory/1MB$ComputerMemory/1KB

    Theoutputofthisisshowninthefollowingscreenshot:

    Whenyouexecutetheprecedingscript,PowerShellwilltakethememorysizeofacomputerinbytesandconvertittoterabytes,gigabytes,megabytes,andkilobytes.Asyoucansee,PowerShellprovidesaquickabilitytodeterminedatacalculationsusingthepredefinedaliases.

  • DateandtimemanipulationWhenyouarescripting,therearetimeswhereyoumayneedtogetthedateandtimeofasystem.PowerShellofferstheget-datecmdlet,whichprovidesthedateandtimeinmanydifferentformatsofyourchoice.

    Toobtainthedateobject,executethefollowingcommand:

    $time=get-date$time

    Theoutputofthisisshowninthefollowingscreenshot:

    Thestandardget-datecmdlet,withoutanytriggers,willgeneratethelongdateandtimeformat.Whenyoustorethedateobjectinavariable,itisimportanttorememberthatthedatacapturedfromthecmdletisasnapshotintime.You’llhavetocalltheget-datecmdletagaintogetnewvaluesfortheupdateddateandtime.

    Thefollowingtabledisplaysallofthedatetimeformattingcodes:

    Formatcode Result Example

    MM Monthinnumericformat 04

    DD Dayinnumericformat 15

    YYYY Yearinnumericformat 2014

    HH Hourinnumericformat(24hrs) 14

    hh Hourinnumericformat(12hrs) 02

    mm Minutesinnumericformat 15

    ss Secondsinnumericformat 12

    tt AM/PM(12hr) PM

    Whenyoucalltheget-datecommand,youalsohavetheabilitytoformatitinmultiplewaysusingthe–formatproperty.Theprecedingtabledisplaysdifferentformattingoptionsyoucanusetocreateyourowndatetimeformat.Thesevaluesarecase-sensitive.

    Toformatthedateobjecttospecificvalues,executethefollowingcommand:

    $date=get-date–format"MM/dd/yyyyHH:MM:sstt"$date

  • Theoutputofthisisshowninthefollowingscreenshot:

    Thepreviouscommanddisplayshowyouleveragetheget-datecmdletwiththe-formattrigger.Whenyouexecutethecommand,itreturnsthevaluesforthemonth,day,year,hours,minutes,seconds,andtheAM/PMindicator.Asyoucansee,youcanleveragethedatetimeformattinginconjunctionwithstringsandothercharacterstocreatethetimeformatyoudesire.

    Toformatthedateobjectandinsertitbetweenstrings,youcanexecutethefollowingcommand:

    $date=get-date–format"MMddyyyyHHMMss"$logfile="Script"+$date+".log"$logfile

    Theoutputofthisisshowninthefollowingscreenshot:

    Theprecedingexampledisplayshowyoucanleveragetheget-datecmdlet,withthe-formattriggertogenerateanameforalogfile.ThisishelpfulinsituationswhereyoumayhavetorunacommandinPowerShellfrequently,andyouhavetolabeltheexecutiontime.Theprecedingscriptwillgeneratethedateandtime,appendthewordScriptinfront,and.logattheendofthestring.Theresultingfilenamefromthisisunique.

    Toadddaysusingthedateobject,executethefollowingcommand:

    $date=(get-date).AddDays(30).ToString("MM/dd/yyyy")$date

    Theoutputofthisisshowninthefollowingscreenshot:

    Theget-datecmdletisalsorobustenoughtobeabletoperformmathoperationswithdates.Theprecedingexamplewilltakethecurrentdate,add30daystoit,andsetittothe$datevariable.YoucanalsouseAddYears(),AddMonths(),AddHours(),AddSeconds(),AddMilliseconds(),andAddTicks()toincreasethetime.Ifyouwanttousesubtraction,youcanenteranegativevalueinthemethodanditwillsubtractthatvaluefromthemethods.ThiswouldlooklikeAddDays(-30)tosubtract30days.

  • NoteFormoreinformationondatetimeformattingvalues,youcangotohttp://technet.microsoft.com/en-us/library/ee692801.aspx.

    Thelastformattingtechniqueimportantforscriptingisconvertingsystemtime/tickstolegibletimeformats.Thisisachievedbycallingthe[DateTime]classandleveragingtheFromFileTimemethod.Theprecedingexampledisplaysformattingtheticknumberof130752344000000000,leveragingthe[DateTime]class,andformattingittoMonday,May04,20151:33:20PM.ThisisusefulforsystemattributesthatareonlydisplayedintickformatsuchasLastLogonTimestamporLastBootUpTime.

    Toconvertfiletimetoadifferentformat,executethefollowingcommand:

    $date=[datetime]::FromFileTime("130752344000000000")$date

    Theoutputofthisisshowninthefollowingscreenshot:

    Theprecedingexampledisplayshowtotakesystemticksandconvertthemintoalegibledatetimeformat.Youfirststartbydeclaringa$datevariable.Youthencallthe[datetime]classandreferencetheFromFileTimestaticfiled.Youfeedtheticktimeof130752344000000000intothestaticfiled.Thisformatstheticktimetothedefaultdatetimeformatandstoresthevalueinthe$datevariable.Youthencallthe$datevariable,andyouseetheconvertedvalueofMonday,May04,20151:33:20PM.

    http://technet.microsoft.com/en-us/library/ee692801.aspx

  • ForcingdatatypesWhiledevelopingscripts,youmayrunintoinstanceswhereyoumaywanttoforceaspecificdatatype.ThisishelpfulincaseswherePowerShellautomaticallyinterpretstheoutputfromacommandincorrectly.Youcanforcedatatypesbytheuseofbracketsspecifyingadatatypeandavariable.

    Toforceastringdatatype,executethefollowingcommand:

    [string]$myString="ForcingaStringContainer"$myString

    Theoutputofthisisshowninthefollowingscreenshot:

    Theprecedingcommandforcesthestringdatatypetothe$myStringvariable.Theresultisthatthe$myStringvariablewillalwaysremainastring.Itisimportanttoknowthatiftheobjectoritemthatyouaretryingtoforcetoadatatypedoesn’thaveadirectconversiontothatdatatype,itwillthrowanerrororexception.Thiswouldbethecaseifyoutrytoinsertastringintoanintegerdatatype.

    Toforceastringdatatypeandgenerateadataexception,executethefollowingcommand:

    [int]$myInt="TryingtoPlaceaStringinanIntContainer"

    Theoutputofthisisshowninthefollowingscreenshot:

    Theprecedingexampledisplaystryingtoinsertastringintoan[int]datatype.Youfirststartbyforcingthe$myIntvariabletobea[int]datatype.Youthentrytosetthatequaltoastringvalueof"TryingtoPlaceaStringinanIntContainer".Afterenteringthecommand,youimmediatelyreceiveanexceptionofCannotconvertvalue"TryingtoPlaceaStringinanIntContainer"totypeSystem.Int32.Thisexampleshowsthatyoucannotmixandmatchdatatypesthatdonothavedirectconversionstoeachother.

    ThereareavarietyofdatatypesthatyoucanforcewithinPowerShell.ThefollowingtablerepresentsthecommondatatypesforusewithPowerShellandanexplanationandanexampleofitsuse:

    Datatype Explanation Example $avalue

  • [string] StringofUnicodecharacters [string]$a="Hello" Hello

    [char] AUnicode16-bitcharacter [char]$a=0xA9 ©

    [byte] An8-bitcharacter [byte]$a=0x0001D 29

    [int] 32-bitinteger [int]$a=12345 12345

    [long] 64-bitinteger [long]$a=1234.243 1234

    [bool] BooleanTrue/Falsevalue [bool]$a=1 True

    [decimal] A128-bitdecimal [decimal]$a=1234.243 1234.243

    [single] Asingle-precision32-bitnumber[single]$a=1234.243 1234.243

    [double] Adouble-precision64-bitnumber[double]$a=1234.243 1234.243

    [datetime] Adatatimevalue [datetime]$a="01-APR-2014" Tuesday,April1,201412:00:00AM

    [xml] AXML-styledvalue[xml]$a="Testing"

    $a.test.aTesting

    [array] Anarray-styledvalue [array]$a=1,2,31

    2

    3

    [hashtable] Ahashtable-styledvalue [hashtable]$a=@{"Old"="New"}Name

    --------

    Old

    Value

    --------

    New

  • PipingvariablesTheconceptofpipingisn’tanythingnewtothescriptingworld.Piping,bydefinition,isdirectingtheoutputofanobjecttoanotherobject.WhenyouusepipinginPowerShell,youaretakingtheoutputofonecommandandsendingthedataforusewithanothersectionofcode.Themanipulationcanbeeithertoamorelegibleformat,orcanbebyselectingaspecificobjectanddiggingdeeperintothoseattributes.Apipeisdesignatedbythe‘|‘symbolandisusedafteryouenteracommand.Theconstructofapipelookslikethis:command|ResultManipulation|SortingObjects.Ifyouneedtoaccesstheindividualitemsinthepipeline,youcanleveragethepipelineoutput$_command.Thistellsthepipelinetoevaluatetheresultsfromthepipelineandtheirattributes.

    Thepipelineoffersawidevarietyofuses;youcanleveragecommandssuchassort-objecttosortbyaspecificattribute,format-listtoformattheobjectsintoalist,andeventheselect-objectwhereyoucanselectspecificattributestoformthepipelineforadditionalprocessing.Select-objectalsoallowsyoutoleveragethe–firstand–lastparameterswithanumbertoselectarecordsetfromthebeginningorendingofthepipeline.Anotherpopularcommandisthewherecommand,whichallowsyoutowriteanexpressiontoselectitemsinthepipelinethatmeetcertaincriteria.

    Topipevaluesfromacmdlet,executethefollowingcommand:

    $services=get-service|where{$_.name–like"*Event*"}|Sort-objectname$services

    Theoutputofthisisshowninthefollowingscreenshot:

    Thisexampledisplaystheuseofpipingtheget-servicescmdlet.Itstartsbygettingalltheservicesonasystem,theuserthenpipesthoseresultstotheselectioncriteriawheretheobject’snameislikethewordevent,whichthenpipesthoseresultstothesortingofobjectsinalphabeticalorderbytheirnameproperty.TheoutputisonlytheserviceswiththenamesthatcontainEventinalphabeticalorder.

    Toobtainallfilesthatarelargerthanaspecificsize,executethefollowingcommand:

    $largeFiles=get-childitem"c:\windows\system32\"|where{$_.length–gt20MB}$count=$largeFiles.countWrite-host"Thereare$countFilesover20MB"write-host"FilesOver20MBinc:\Windows\System32\:"$largefiles|select-objectname,length,lastwritetime|format-list

    Theoutputofthisisshowninthefollowingscreenshot:

  • Whenyouleveragethepipecommand,youhavetheabilitytofindspecificdatapertainingtoanobject.Inthisexample,yousearchallofthefilesinc:\windows\system32todeterminewhetherthereareanyfilesthathaveasizegreaterthan20MB.Youwereabletopipetheget-childitemcmdlettothewhereoperatorwiththeselectioncriteria$_.lengthisgreaterthan20MB.Theseresultswereplacedinthe$largeFilesvariable.Fromthere,youusethecount()methodtocountthenumberoffilesthatarelargerthan20MB.YouthenprinttoscreenthetextThereare$countfilesover20MB.YoualsoprinttothescreenFilesover20MBinc:\Windows\System32\:toprovidetextforthefollowingpipedcommand.Youthenneedtotaketheresultsinthe$largeFilesvariableandpipetheresultstotheselect-objectcommandtoselectthename,length,andlastwritetime.Finally,youpipethoseresultstotheformat-listcommand,whichprovidesaformattedlistofresults.

  • SummaryThischapterexploresthemanymethodsyoucanusetomanipulateandparsedatawithPowerShell.Youlearnedtechniquesthatwillhelpyoubetterworkwithdataandprovidearicherexperienceforindividualsusingyourscripts.

    Thestringmanipulationsectiontaughtyoumanydifferentmethodstoworkwithstrings.Thisincludedchangingthecase,splittingandreplacingstrings,countingandtrimmingstrings,searchingstrings,andviewingsubstrings.ThenumbermanipulationsectiontaughtyouhowtousemathematicaloperationswithinPowerShell.Thissectiondisplayeddifferentwaystoformatnumbers,roundnumbers,andcalculatingcomplexmathematicaloperations.Thedatetimesectionofthischapterprovidedyouwithtoolstousewhenyouneedtogatherdateandtimeinformationfromasystem.Youlearnedhowtoformattheget-datecmdlet,manipulatetheresults,andaddorsubtractfromdatevalues.

    Thischapteralsoexploredtheforcingofdatatypeswhileworkingwithvariables.Thissectionprovidedexamplesofdifferentdatatypesthatareavailabletouse,andprovidedanexampleonhowtoforceaspecificdatatype.Youthenwrappedupwithanexplanationonpipingandhowtoconstructproperpipingclauses.Itexploredhowtoleveragepipingtosortdataafteraresultisreturnedandprovidedexamplesofpipingwithandwithoutadatasort.

    DataparsingandmanipulationisessentialtosuccessfulscriptingwithPowerShell.Withoutusingthesemanipulationtechniquesinthischapter,youmaybeoverlycomplicatingyourscripts.Whileitmaytaketimetofullylearnthesetechniques,it’sessentialtobecomeagoodPowerShellscripter.Inthenextchapter,you’lllearnhowthemanipulateddatayougeneratecanbecorrelatedtoseewhetheritmatchescertaincriteria.You’lllearnthatthecomparisonsaredonewiththeuseofcomparisonoperators.

  • Chapter3.ComparisonOperatorsPowerShellcomparisonoperatorsareusedtovalidatedatapresentwithinyourscripts.Theseoperatorsenableyoutocomparedataandexecutecodebasedonthedata.ThismakesPowerShellanextremelyeffectivetooltouseforprocessingcomplicateddatawiththeavailablecomparisonoperators.

    Inthischapter,youwilllearnthefollowingconcepts:

    ComparisonoperatorbasicsEqualandnotequalcomparisonoperatorsGreaterthanandlessthancomparisonoperatorsContains,like,andmatchcomparisonoperators-AND/-ORcomparisonoperatorsBestpracticesforcomparisonoperators

  • ComparisonoperatorbasicsWhenyouareusingcomparisonoperators,youarecreatingexpressionsthatevaluatetoeitherTrueorFalse.Inprogramming,thisisknownasBoolean.Inthesimplestform,youareaskingPowerShelltoevaluatesimilaritiesordissimilaritiesbetweentwoitems.Basedonthefindingsfromthatexpression,itwillreturnTrueorFalse.WhenthewholeexpressionreturnsFalse,PowerShelldoesn’tcontinuetoprocessitemsinthestatement.WhenthewholeexpressionreturnsTrue,PowerShellwillproceedforwardintothestatementandexecutethecodewithinthestatement.

    Ofthemanybuilt-invariablesthatPowerShellhas,therearetwobuilt-inBooleanvariables.Thesetwovariablesare$Trueand$False.Whenyoucall$True,itimpliesthatthevalueisBooleanandissettoTrue.Whenyoucall$False,itimpliesthatthevalueisBooleanandissettoFalse.

    Ascriptthatshowshowtousebasiccomparisonoperatorswouldlooklikethis:

    $TrueVariable=$True$FalseVariable=$Falseif($TrueVariable){Write-Host"StatementisTrue."}if($FalseVariable){Write-Host"StatementisFalse."}

    Theoutputofthiscommandisshowninthefollowingscreenshot:

    ThisexampledisplayshowtodoabasicBooleancomparison.Youfirststartbydeclaring$TrueVariableandsettingitequaltoTrue.Youthendeclare$FalseVariableandsetittoFalse.Youthencreateanifstatementtoevaluatetheexpression$TrueVariabletoseewhetheritevaluatestoTrue.SincethevariableissettoTrue,itwillevaluatetoTrueandcontinuetoprocesstheremainingitemsinthestatement.PowerShellwillprinttothescreenthemessageStatementisTrue.Youthencreateanotherifstatementtoevaluatetheexpression$FalseVariabletoseewhetheritevaluatestoTrue.AsthevariableissettoFalse,theexpressionwillevaluatetoFalseandstopprocessingthestatement.

  • EqualandnotequalcomparisonThemostbasicandmostusedcomparisonoperatorisequalto(-eq).Thisoperatorisflexibleinnatureasitcanbeusedforstrings,integers,andobjects.The-eqoperatorisusedbycallingvalue1isequaltovalue2.Whenthe–eqoperatorevaluatesthestatement,itwillreturnaBooleanvalueofeitherTrueorFalse.IftheexpressionevaluatestobeTrue,PowerShellwillcontinuetoproceedtoexecutethecode.

    Ascriptthatshowshowtouseequalcomparisonoperatorswouldlooklikethis:

    $value1="PowerShell"$value2="PowerShell"if($value1–eq$value2){Write-Host"It'sEqual!"}

    Theoutputofthisisshowninthefollowingscreenshot:

    Fromtheprecedingexample,youwillseethattheequalcomparisonoperatordeterminesthat$value1isequalto$value2anditwritestothescreenIt'sEqual!.Intheinstancethatyouwanttodeterminewhethertwovaluesarenotequal,youcanusethe–neoperator.Thisdoestheinverseofthe–eqoperator.

    Ascriptthatshowshowtousenotequalcomparisonoperatorswouldlooklikethis:

    $value1="PowerShell"$value2="POSH"if($value1–ne$value2){Write-Host"ValuesAreNotEqual"}

    Theoutputofthiscommandisshowninthefollowingscreenshot:

    Whenyouruntheprecedingscript,PowerShellwilldeterminethat$value1and$value2arenotequal.ThescriptwillwritetothescreenthemessageValuesAreNotEqual.Whilescripting,itisimportanttominimizetheuseofthenotequal–neoperator.Whenyoustartlayeringisequaltoandnotequaltoinyourscripts,thelogicalcomplexityofthescriptsignificantlyincreases.Thisiswhyitisrecommendedthatbeginnersshouldtypicallyonlyusethe–neoperatorininstanceswhereavaluecannotequalaspecificvalueandeveryothervalueisacceptable.

    Ascriptthatshowshowtouse“notequal”comparisonoperatorswouldlooklikethis:

    $value="Thisisavalue."$length=$value.length

  • If($length–ne0){Write-Host"Thevariablehasdatainit.Dothisaction"}

    Theoutputofthiscommandisshowninthefollowingscreenshot:

    Theprecedingexampledisplaystheproperuseofthe–neoperatorforbestpractices.Thisscriptcountsthecharactersin$value,andifthelengthofthevariableisnotequalto0,thescriptwillwritetotheconsoleThevariablehasdatainit.Dothisaction.Inyourscripting,youwillwanttofollowsuitwhereyouuse–neforverificationthatthedataisnotvalidbeforecontinuingwithyourscript.

  • GreaterthanandlessthancomparisonPowerShellhastwooperatorstocomparetwovaluestodeterminewhethertheyaregreaterthan(–gt)orlessthan(-lt)eachother.Thisisnotjustlimitedtonumbers,butalsohastheabilitytocomparedatesandtimesaswell.Thesearehelpfulininstanceswhereyouneedtocomparefilesizesormodificationdatesonfiles.

    Ascriptthatshowshowtousethe“lessthan”comparisonoperatorwouldlooklikethis:

    $number1=10$number2=20If($number1–lt$number2){Write-Host"Value$number1islessthan$number2"}

    Theoutputofthiscommandisshowninthefollowingscreenshot:

    Intheprecedingexample,yousetthe$number1variableto10andthe$number2variableto20.Youthenusethe“lessthan”(–lt)operatortodeterminewhetherthe$number1variableislessthan$number2.Sincethisatruestatement,theconsoleoutputsthemessageValue$number1islessthan$number2.

    Ascriptthatshowshowtousethe“greaterthan”comparisonoperatorwouldlooklikethis:

    $olddate=Get-DateStart-Sleep–seconds2$newdate=Get-DateIf($newdate–gt$olddate){Write-Host"Value$newdateisgreaterthan$olddate"}

    Theoutputofthiscommandisshowninthefollowingscreenshot:

    Inthisscript,youstartbysettingthe$olddatevariabletothecurrentdateandtime.Thestart-sleepcmdletisthenusedtopausethescriptfor2seconds.Whenthescriptcontinues,youset$newdateandtimevariableto2secondslater.Byusingthegreaterthan(-gt)operator,youdeterminethatthevaluesaredifferentandthatthe$newdatevalueisgreaterthanthe$olddatevalue.

    TipInadditionto“greaterthan”and“lessthan”operators,youalsohavetheoptionto

  • compare“greater”or“equal”(-ge)and“less”or“equal”(-le).Thesecomparisonoperatorscanbehandywhencreatingcountersorloopsthatrequireyoutoincrementanumberuntilitequalsorisgreaterthanaspecificvalue.

  • Contains,like,andmatchoperatorsThe-contains,-like,and-matchoperatorsareverysimilarinfunction.Whiletheyallcomparedata,theyallhavetheirownpurposeinyourscripts.Eachoftheseoperatorsarecase-insensitive.Thismeansthatwhenyouaresearchingforitemsusingtheseoperators,theywillmatchallinstancesofthevalueintheexpression.Ininstanceswhereyouneedthesearchtobecase-specific,youcanappendcinfrontoftheoperatortoforcecasesensitivity.Thesewouldlooklike–ccontains,-clike,and–cmatch.Toforcecaseinsensitivity,youcanalsoappendiinfrontoftheoperator.Thesewouldlooklike–icontains,-ilike,and–imatch.

    Eachoftheseoperatorsalsohasaninverseoperatorthatisformedbyappendingtheword“not”infrontoftheoperator.Examplesoftheseoperatorsinclude–notcontains,-notlike,and-notmatch.Youmayalsoappendcasesensitivityandcaseinsensitivitytotheseoperators.

    The-containsoperatorlooksforanexactmatchtoavalueinanexpression.ItwillthenreturnaTrueandFalseresult.The–containsoperatorisflexibleasitcanevaluatetheindividualvaluesinanarraywithasingleexpression.Thisallowsyoutocreateefficiencyinyourcodebyevaluatingmorethanoneitemperlineofcode.

    Ascriptthatshowshowtousethe-Containscomparisonoperatorwouldlooklikethis:

    $myarray="this","is","my","array"If($myarray–contains"this"){Write-Host"Thearraycontainstheword:this"}If($myarray–notcontains"that"){Write-Host"Thearraydoesnotcontaintheword:that"}

    Theoutputofthiscommandisshowninthefollowingscreenshot:

    Intheprecedingexample,youcreateanarraywithfourvaluesinit.Youthenusethe–containsoperatortodeterminewhetherthearrayhasthethisvalue.Asthearraydoeshavethisvalue,itthenevaluatesthestatementtobeTrue,andproceedstowritetotheconsolethemessageThearraycontainstheword:this.Thesecondpartofthisevaluationistochecktoseewhether$myarraydoesnotcontainthewordthatbyusingthe–notcontainsoperator.Since$myarraydoesnothavethewordthat,itproceedstowritetotheconsoleThearraydoesnotcontaintheword:that.

    The-likecomparisonoperatorisdifferentthanthe-containsoperator.The–likeoperatorrequiresthatbothsidesoftheexpressionshouldbeevaluatedtomatchthefullstring.Youcanquicklydeterminewhethertherearevaluesthatareclosetoavalueyouarelookingfor,whichwillthenreturnTrueorFalse.Thisiswhythe–likecomparison

  • operatortypicallyuseswildcardcharactersdesignatedbyanasterisk(*)orquestionmark(?).Itprovidestheflexibilitytoquicklysearchavarietyofvaluesusingasingleexpression.Theasteriskwildcarddesignatesthattheexpressioncanmatchanyvaluesbeforeorafterthestatedword,dependingonwheretheasteriskisplaced.Thequestionmarkallowsyoutomatchanyvaluespresentbetweentwostrings.Forexample,youcanuse–like"myfile?.txt",whichwillmatchanyvaluethatstartswithmyfileandendswiththeextension.txt.AnyvaluesbetweenthosecharacterswillbereturnedasTrue.

    Ascriptthatshowshowtousethe–likecomparisonoperatorwouldlooklikethis:

    $myexample="ThisisaPowerShellexample."If($myexample–like"*shell*"){Write-Host"Thevariablehasawordthatislikeshell"}If($myexample–notlike"*that*"){Write-Host"Thevariabledoesn'thaveawordthatislikethat"}

    Theoutputofthiscommandisshowninthefollowingscreenshot:

    Theprecedingscriptdisplaysthestring$myexample,forwhichyousearchforthevalueofshell.Asthevalueispartofanotherword,youneedtoappendthewildcardcharacteronbothsidesoftheword“shell”.Whenyousearchfortheword*shell*,includingthewildcardcharacters,theresultreturnstrue.TheconsolethenoutputsthemessageThevariablehasawordthatislikeshell.Whenyouexecutethesecondcomparisonusingthe–notlikeoperator,youareabletosearchthestringforwordsthatarenotlikethat.Sinceyouusethewildcardsoneachsideoftheword,itdoesasecondarycomparisontomakesurethattherearen’tpartialvaluesinthevariablethatreflectthat.Sincetherearenovaluesinthevariablethatevaluatetobelikethat,itoutputstothescreenthemessageThevariabledoesn'thaveawordthatislikeshell.

    TipYouhavetouseanasterisk(*)onbothsidesofthesearchevaluationcriteriaasPowerShellinterpretseverycharacterinthesentenceasavalue.Whileinherentlyyoumaybreakaparteachwordinthevariableasseparatevalues,PowerShellseesitasonecontiguousgroupofcharacters.Tofindasubstringofavariableandhaveitevaluateto“True”usingthe–likeoperator,youwillneedtouseanasterisk(*)onbothsides.

    Thematchcomparisonoperatorusesregularexpressionstomatchinformationbetweentwovariables.The-matchoperatorisuniqueinthefactthatitautopopulatesavariablenamed$matcheswiththewordthatmatchesyoursearch.Thisishelpfulintheinstancewhereyouneedtoonlyretrieveobjectsthatmatchacertaincriteria.With“match”,youcanalsoleveragetheuseofregularexpressionstomatchcriteriatoavariable.

    Ascriptthatshowshowtousethe–matchand-notmatchcomparisonoperatorswouldlooklikethis:

  • $myexample="Thenetworkwentdown."If($myexample–match"[o]"){Write-Host"Thevariablematchedthelettero.(Containstwoo's)"}$matchesIf($myexample–notmatch"[U]"){Write-Host"ThevariabledoesnotmatchU.(Doesn'thaveaU)"}

    Theoutputofthiscommandisshowninthefollowingscreenshot:

    Theprecedingexamplecreatesanewvariablenamed$myexamplewiththestringvalueofThenetworkwentdown..Youthencomparethe$myexamplevariabletotheregularexpression[o]oronethatcontainsaninstanceofotoseethatit’samatch.Sinceoexistsatleastoncecontainedin$myexample,theexpressionreturnsTrueandtheconsoleoutputsthemessageThevariablematchedthelettero.(Containstwoo's).Afteryoumakethatcomparison,youthendisplaythecontentsofthe$matchesvariable.Youwillseethatthe$matchvariableautopopulateswiththevalueofanindexof0andnameofo.Thelastpartofthescriptisanevaluationtoseewhether$myexampledoesnotmatchtheregularexpressionof[U]ordoesnotcontainaninstanceofU.SincethevariabledoesnotcontainaninstanceoftheletterU,itevaluatestobeTrueandwritestotheconsolethemessageThevariabledoesnotmatchU.(Doesn'thaveaU).

  • And/ORcomparisonoperatorsThe–andand–orcomparisonoperatorsareusedtoevaluatemultipleexpressionspresentwithinasinglelineofcode.TheseareusedtoseewhethertwoormoreexpressionsevaluatetobeTrue.The–andcomparisonoperatormandatesthatbothevaluationsmustevaluatetobeTruetoproceedinthestatement.Thismeansthatexpression1andexpression2mustbeTruetocontinue.The–orcomparisonoperatoronlyrequiresoneofthetwoexpressionstobeTrue.Thismeansthatexpression1orexpression2canbeTruetocontinue.AsyouarelearningPowerShell,youwillwanttousecautionwhileusingthe-andand-orcomparisonoperatorsastheycanquicklycomplicatethelogicofyourscripts.

    Ascriptthatshowshowtouse–andand-orcomparisonoperatorswouldlooklikethis:

    $myvar=$True$myothervar=$FalseIf($myvar–eq$True–AND$myothervar–eq$False){Write-Host"BothstatementsevaluatetobeTrue"}If($myvar–eq$True–OR$myothervar–eq$True){Write-Host"AtleastonestatementevaluatestobeTrue"}

    Theoutputofthisisshowninthefollowingscreenshot:

    Theprecedingexamplebrieflydisplayshowtousethe–andoperatorandthe–oroperator.Inthisexample,youcreatetwodifferentvariables.Youthenchecktoseewhether$myvarequalsTrue,whichevaluatestobeTrue.Youevaluatewhether$myothervarisequaltoFalse,whichevaluatestobeTrue.Inorderforthe–andoperatortobesuccessful,bothstatementshavetoevaluatetobeTrueintheevaluationcriteria.SinceboththestatementsevaluatetobeTrue,theconsoleoutputsthemessageBothstatementsevaluatetobeTrue.Eventhoughthe$myothervarvariableissettoFalse,theevaluationtoseewhetherthatvariableissettoFalsemakesthatstatementTrue.

    Thesecondstatementyouevaluateiswheneither$myvaror$myothervarequalsTruebyusingthe–ORoperator.Likethefirstevaluation,thefirstvariableevaluatestobeTrue.However,thesecondvariableevaluatestobeFalse.Sincethe–oroperatoronlyrequiresoneofthetwostatementstobeTrue,theentirestatementevaluatestobeTrue.TheconsolewilloutputthemessageAtleastonestatementevaluatestobeTrue.

  • BestpracticesforcomparisonoperatorsPowerShelloffersmanydifferentcomparisonoperatorsforusewithinyourscripts.ItiseasytostartbuildingoverlycomplexscriptsbyoverusingcomparisonoperatorsorbyevaluatingitemsthatyoumaynothavetouseinPowerShellfunctioning.Refertothefollowingguidelinestosticktowhenyouaredevelopingyourscripts.Thesewillhelpyouavoidoveruseofcomparisonoperators:

    Assumethescriptisdesignedtoproceed:Whenyouassumeyourscriptisdesignedtoproceedtothenextstep,youcanreducethenumberofcomparisonoperatorsyouuse.IfyouexpectavaluetobeTrue,onlymakeastatementtocatchwhetherthestatementisFalse.Don’tchecktoseewhetherthestatementisTrue,asPowerShellisdesignedtosequentiallyproceedanywaytothenextstep.Avoiddoublenegativestatements:Whenyouaredevelopingyourcode,avoidtheuseofdoublenegativestatements.AvoidcheckingtoseewhetheravaluedoesnotequalFalse.Whatyou’rereallytryingtodoischecktoseewhetherastatementevaluatestobeTrue.Doublenegativescanbeconfusingtoyouandotherdevelopersreadingyourcode.Staypositive(True)whileyou’recoding:Alwaysattempttoavoidtheuseofnotandnegativeevaluationstatements.Whiletherecanbeaplaceforthenotbasedoperators,trytocreatecodethatevaluateswhenstatementsareTrue.Thenotbasedoperatorsgrowsignificantlyincomplexitywhenusedwithregularexpressionsandcanbeconfusingtoyouandotherdevelopersreadingyourcode.

  • SummaryThischapterexploredthemanymethodswithwhichyoucanusePowerShelloperators.Youstartedbylearningthecomparisonoperatorbasics.Youthenlearnedabouttheequalandnotequalandgreaterthanandlessthancomparisonoperators.Youlearnedthatyoucanusetheseoperatorstocomparenumbers,strings,dates,andtimes.Youthenproceededtoexplorethe-contains,-like,and-matchoperators.Youlearnedthatyoucanaddnottotheseoperatorstocreatetheinverseoftheoperator.Youalsounderstoodthatyoucanaddcforcasesensitivityandiforcaseinsensitivitytothecomparisonoperators.Youalsosawhowtojoinmultipleoperatorsusingthe-and/-oroperators.

    Thechapterendsbyprovidingthebestpracticesfortheimplementationofcomparisonoperators.Bytheendofthischapter,youshouldbeproficientinusingcomparisonoperators,knowwhattoavoid,andbewellonyourwaytoevaluatingvariablesandarrays.Inthenextchapter,youwillexplorehowyoucancreatecodethatcanbecalledmultipletimesandleveragecomparisonoperatorswithfunctions,loops,switches,andmethods.

  • Chapter4.Functions,Switches,andLoopsStructuresWhenyouarescriptinginPowerShell,youwillfindthatalotofyourcodingeffortswillrequirethecodetoberepeatedmultipletimesinthesamescript.Whilerepeatingthesamecodemayhelpyouaccomplishthetask,therearemanyotheroptionsforcodingmoreefficientscripts.Thischapterexploresdifferenttechniquesforwhichyoucanreusecodeinsteadofrepeatingthesamecodesegmentswithinthesamescript.

    Inthischapter,youwilllearnaboutthefollowingconcepts:

    CreationoffunctionsCreationofloopsCreationofswitchesCombiningtheuseoffunctions,switches,andloopsBestpracticesforfunctions,switches,andloops

  • FunctionsWhenyouneedtoqueryorexecutecodemorethanonce,thegeneralruleisthatyoushouldcreateafunctiontoperformtheaction.Functionsareblocksofreusablecode,whichyoucanexecutemultipletimesbycallingthefunction’sname.Youmustplaceafunctionnearthebeginningortopofthescript.ThisallowsPowerShelltointerpretthewholefunctionbeforeyouuseitlaterinthecode.Allothercode,includinginvokingthefunctions,shouldfollowthefunctionssection.IfyoucallafunctionthathasnotyetbeenparsedbyPowerShell,itwillthrowanexceptionstatingthatnosuchcmdletorfunctionexists.

    Functionnamescanbeanywordorsetofwords;however,itisrecommendedtonamethefunctionsimilartotheverb-nouncmdletnamingsyntax.Tocreateafunction,youneedtousethewordFunctionanddeclareafunctionnamelikedisplay-text.Youthenneedtoenclosetherepeatablecommandsincurlybracketsafterthefunctionname.

    Thepropersyntaxofafunctionlookslikethis:

    FunctionDisplay-Text{Write-Host"ShowingText"}Display-Text

    Theoutputofthiscommandisshowninthefollowingscreenshot:

    Thisexampledisplayshowtoproperlydeclareafunction.YoufirstcalltheFunctioncommandwiththeDisplay-Textfunctionname.YouthenplaceWrite-Host"ShowText"inthecurlybracketsafterdeclaringthefunctionname.YouthencallthefunctionbytypingDisplay-Text.Afterexecutingthescript,theconsolewillprinttothescreenthemessageShowingText.

    Functionsalsoallowyoutopassindataforprocessing.Oneofthemethodstopassindataintoafunctionistodeclarevariablesafterthefunctionnameinparentheses.Thisfunctionwillthenbeabletousethosevariablesandthedatainthosevariableswithinitself.Ifyouwanttopassinmultipleargumentsintoafunction,youcanseparateeachvariablewithacomma.

    Theformattodeclareafunctionwithparametersinparentheseslookslikethis:

    FunctionDisplay-Text($variable1,$variable2){Write-Host"FirstFunctionArgument:$variable1"Write-Host"SecondFunctionArgument:$variable2"}Display-Text"Hello""Readers"

    Theoutputofthisisshowninthefollowingscreenshot:

  • Thisexampledisplayshowtoproperlydeclareafunctionwiththeparameterinparentheses.YoufirstcalltheFunctioncommandwiththeDisplay-Textfunctionname.Youthenplacethevariables,$variable1withacommaand$variable2inparentheses,beforethecurlybrackets.Insidethecurlybrackets,youdeclareWrite-Host"FirstFunctionArgument:$variable1"andWrite-Host"SecondFunctionArgument:$variable2".YouthencallthefunctionbytypingDisplay-TextwiththeargumentsofHelloandReaders.Afterexecutingthescript,theconsolewillprinttothescreenFirstFunctionArgument:HelloandSecondFunctionArgument:Readers.

    AnothermethodtopassindatatoafunctionisthroughtheuseofaparameterblockofParam.Paramtakesinwhateverdatayoupassintothefunctionandstoresthatdataindeclaredvariables.Ifyouwanttopassinmultipleargumentsintoafunction,youcanseparateeachvariablewithacomma.Whenyouaredeclaringparametersusingthismethod,Paramneedstobethefirstitemdeclaredaftertheopencurlybracketinafunction.

    Theformattodeclareafunctionwithparamlookslikethis:

    FunctionDisplay-Text{Param($variable1,$variable2)Write-Host"FirstFunctionArgument:$variable1"Write-Host"SecondFunctionArgument:$variable2"}Display-Text"Hello""Readers"

    Theoutputofthiscommandisshowninthefollowingscreenshot:

    ThisexampledisplayshowtoproperlydeclareafunctionwithparametersinaParamblock.YoufirstcalltheFunctioncommandwiththeDisplay-Textfunctionname.YouthencalltheParamblockasthefirstcommandinsidethecurlybrackets.InsidetheParamblock,youdeclarethevariables$variable1withacommaand$variable2.AftertheParamblock,youdeclareWrite-Host"FirstFunctionArgument:$variable1"andWrite-Host"SecondFunctionArgument:$variable2".YouthencallthefunctionbytypingDisplay-TextwiththeargumentsHelloandReaders.Afterexecutingthescript,theconsolewillprinttothescreenFirstFunctionArgument:HelloandSecondFunctionArgument:Readers.

  • TheParamblockisspecialasitcanalsoacceptadditionaldecoratorswhendeclaringthevariables.The[Parameter()]decoratorallowsyoutoincludeadditionalargumentsthatenableyoutovalidatevariablesandevenprovidehelpinformationforvariablesinfunctions.WhenyoudeclaretheMandatoryargumentandsetitequalto$True,itwillrequirethatthevariableisusedinthefunctiontocontinue.IfyousettheMandatoryargumentto$False,itwillnotberequiredwhenusingthefunction.YoucanalsocallthePositionargument,whichdeclareswhatpositionthevariablewillbedeclared.ThismeansthatifyousetthePositionargumentto1,itmustbethefirstargumentpassedintothefunction.Ifyoudon’tusethePositionargument,youwillonlybeabletopassinthevariablesusingparameterthatreferencesthevariablename.AnotherpopularargumentistheHelpMessageargument,