PowerShell

Exporting Importing and Formatting

Like export-csv out-file out-html and the like


Comparing processes with a reference xml output of current processes

First exporting the Get-Process to xml


        Get-Process  | Export-Clixml -Path C:\temp\Processes.xml
        Mode                LastWriteTime         Length Name
        ----                -------------         ------ ----
        -a----       28/05/2020   9:20 AM       28110462 Processes.xml
        

Just so I have some process to compare I am opening the calculator, notepad, ISE and word and I have closed PowerShell . And now I will compare them.

        Compare-Object -ReferenceObject (Import-Clixml C:\temp\Processes.xml) -DifferenceObject (Get-Process) -Property name
    
        name           SideIndicator
        ----           -------------
        FileCoAuth     =>           
        notepad        =>           
        powershell_ise =>           
        RuntimeBroker  =>           
        WINWORD        =>           
        conhost        <=           
        powershell     <=           
        svchost        <=     
        

A left pointing arrow means that something was on in the reference object but not present in the difference object and visa versa right arrows right arrows mean new objects

Sorting

        Get-Process -Name a* | Sort-Object -Property ws -Descending
        

You can sort on multiple properties by seperating them with a comma


        Get-Process -Name a* | Sort-Object -Property name,ws -Descending
    
        Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
        -------  ------    -----      -----     ------     --  -- -----------
            566      15    16892      21588      33.27  17344   0 audiodg
            771      49    22544        392       1.34   8380   1 AudibleRT.WindowsPhone
            627      34    24220      30096      47.31  10572   1 ApplicationFrameHost
            297      17     4232       4996      14.42   3924   1 Amazon Music Helper
            606      51   108172     151080     235.31  11844   1 Amazon Music
           1256      66    86372     132100     212.63  16900   1 Amazon Music
            630      37    50884      71792     134.30   9204   1 Amazon Music
            261      20    18032      30268       0.72   9692   1 Amazon Music
            195      15     2760       5144              8312   0 aesm_service
        

Select

Select can be used to pull out only the data you are interested in.


        Get-Process -Name a* | select name
    
        Name
        ----
        aesm_service
        Amazon Music
        Amazon Music
        Amazon Music
        Amazon Music
        Amazon Music Helper
        ApplicationFrameHost
        AudibleRT.WindowsPhone
        audiodg
        

Measure Object

Measure-object can be used to find max min average and sum of and object.


        ps | Measure-Object -Property ws -Maximum -Minimum -Average -Sum
    
        Count    : 229
        Average  : 21158236.7860262
        Sum      : 4845236224
        Maximum  : 278446080
        Minimum  : 0
        Property : WS
        

Select-Object with Expression

The basic format here is @{name='';expression={}}


        ps | Select-Object name,id,@{name="VM(MB)";expression={$_.vm / 1MB -as[int]}}
    
        Name                                                              Id  VM(MB)
        ----                                                              --  ------
        aesm_service                                                    8312    4203
        Amazon Music                                                    9204     638
        Amazon Music                                                    9692     242
        Amazon Music                                                   11844     500
        Amazon Music                                                   16900     497
        Amazon Music Helper                                             3924     100
        

Get-Member

Most of the time when you run a command in PowerShell the output is filtered. to find all the properties of an object you can pipe the command to Get-Member or its alias gm


        Get-Service | Get-Member
    
       TypeName: System.ServiceProcess.ServiceController
    
        Name                      MemberType    Definition                                                                                 
        ----                      ----------    ----------                                                                                 
        Name                      AliasProperty Name = ServiceName                                                                         
        RequiredServices          AliasProperty RequiredServices = ServicesDependedOn                                                      
        Disposed                  Event         System.EventHandler Disposed(System.Object, System.EventArgs)                              
        Close                     Method        void Close()                                                                               
        Continue                  Method        void Continue()                                                                            
        CreateObjRef              Method        System.Runtime.Remoting.ObjRef CreateObjRef(type requestedType)                            
        Dispose                   Method        void Dispose(), void IDisposable.Dispose()                                                 
        Equals                    Method        bool Equals(System.Object obj)                                                             
        ExecuteCommand            Method        void ExecuteCommand(int command)                                                           
        GetHashCode               Method        int GetHashCode()                                                                          
        GetLifetimeService        Method        System.Object GetLifetimeService()                                                         
        GetType                   Method        type GetType()                                                                             
        InitializeLifetimeService Method        System.Object InitializeLifetimeService()                                                  
        Pause                     Method        void Pause()                                                                               
        Refresh                   Method        void Refresh()                                                                             
        Start                     Method        void Start(), void Start(string[] args)                                                    
        Stop                      Method        void Stop()                                                                                
        WaitForStatus             Method        void WaitForStatus(System.ServiceProcess.ServiceControllerStatus desiredStatus), void Wa...
        CanPauseAndContinue       Property      bool CanPauseAndContinue {get;}                                                            
        CanShutdown               Property      bool CanShutdown {get;}                                                                    
        CanStop                   Property      bool CanStop {get;}                                                                        
        Container                 Property      System.ComponentModel.IContainer Container {get;}                                          
        DependentServices         Property      System.ServiceProcess.ServiceController[] DependentServices {get;}                         
        DisplayName               Property      string DisplayName {get;set;}                                                              
        MachineName               Property      string MachineName {get;set;}                                                              
        ServiceHandle             Property      System.Runtime.InteropServices.SafeHandle ServiceHandle {get;}                             
        ServiceName               Property      string ServiceName {get;set;}                                                              
        ServicesDependedOn        Property      System.ServiceProcess.ServiceController[] ServicesDependedOn {get;}                        
        ServiceType               Property      System.ServiceProcess.ServiceType ServiceType {get;}                                       
        Site                      Property      System.ComponentModel.ISite Site {get;set;}                                                
        StartType                 Property      System.ServiceProcess.ServiceStartMode StartType {get;}                                    
        Status                    Property      System.ServiceProcess.ServiceControllerStatus Status {get;}                                
        ToString                  ScriptMethod  System.Object ToString();
        

You can use Format-List * if you want to see the actual values of the properties and alias properties


        Get-Service -Name BITS | Format-List *
    
        Name                : BITS
        RequiredServices    : {RpcSs}
        CanPauseAndContinue : False
        CanShutdown         : False
        CanStop             : True
        DisplayName         : Background Intelligent Transfer Service
        DependentServices   : {}
        MachineName         : .
        ServiceName         : BITS
        ServicesDependedOn  : {RpcSs}
        ServiceHandle       : SafeServiceHandle
        Status              : Running
        ServiceType         : Win32OwnProcess, Win32ShareProcess
        StartType           : Automatic
        Site                : 
        Container           : 
        

Format-Wide

Format-Wide only displays one thing and by default it displays it in two columns


        Get-Process | Format-Wide
    
        aesm_service                                                      Amazon Music                                                     
        Amazon Music                                                      Amazon Music                                                     
        Amazon Music                                                      Amazon Music Helper                                              
        ApplicationFrameHost                                              AudibleRT.WindowsPhone                                           
        audiodg                                                           Calculator                                                       
        chrome                                                            chrome                
        

You can however increase the amount of columns


        Get-Process | Format-Wide -Column 6
    
        aesm_service          Amazon Music          Amazon Music          Amazon Music          Amazon Music          Amazon Music Helper  
        ApplicationFrameHost  AudibleRT.WindowsP... audiodg               Calculator            chrome                chrome               
        chrome                chrome                chrome                chrome                chrome                chrome               
        

Format Table

Format table is the default display if there are less than 3 columns

The alias is FT. With FT you can use auto size and groupby and -wrap


        Get-Service |sort status | ft  -GroupBy status -AutoSize
    
    
        Status: Stopped
    
        Status  Name                                     DisplayName                                                                       
        ------  ----                                     -----------                                                                       
        Stopped AarSvc_547a8                             Agent Activation Runtime_547a8                                                    
        Stopped PNRPsvc                                  Peer Name Resolution Protocol                                                     
        Stopped PolicyAgent                              IPsec Policy Agent                                                                
        Stopped PrintNotify                              Printer Extensions and Notifications         
        --------------------------------------------------------------------
        Status: Running
    
        Status  Name                            DisplayName                                                         
        ------  ----                            -----------                                                         
        Running BthAvctpSvc                     AVCTP service                                                       
        Running BTAGService                     Bluetooth Audio Gateway Service                                     
        Running BrokerInfrastructure            Background Tasks Infrastructure Service                             
        Running bthserv                         Bluetooth Support Service      
        

You can also include expressions in FT


        ps  |ft name,id,@{n='VM(MB)';e={$_.vm / 1mb};formatstring='n2';align='right';width=12},@{n='PM(MB)';e={$_.pm / 1mb};formatstring='n2';align='right';width=10} -AutoSize 
    
        Name                                                              Id       VM(MB) PM(MB)
        ----                                                              --       ------ ------
        aesm_service                                                    8312     4,203.22   2.70
        Amazon Music                                                    9204       637.50  49.75
        Amazon Music                                                    9692       241.57  17.62
        Amazon Music                                                   11844       500.35 111.02
        Amazon Music                                                   16900       502.04  88.32
        Amazon Music Helper                                             3924       100.26   4.07
        ApplicationFrameHost                                           10572 2,101,514.50  23.14
        

The Format Operator

The first number is the index and after the colon the n value is the amount of decimals


        "{0} {1:n2} {3} {2:n4}" -f "hello",4.5756345634,6.475333,"there"
        hello 4.58 there 6.4753
        

Write Host

Write-Host only displays text to the screen it does not allow you to send output to the pipeling

It does however have the advantage of being able to colour text and change the background colour.

This makes it useful for the kind of commands that are interactive like show commands


        PS C:\>Write-Host "Hello World" -ForegroundColor magenta -BackgroundColor white    
        Hello World
        

Read Host

You can get users to interactively enter data with Read-Host


        PS C:\> Read-Host -Prompt "Please enter your age?"
        Please enter your age?: 42
        42
        

This can be used to set variables before running some kind of script. It can be used with menus.

Write Verbose

This is kind of like write host except it only appear when you either set the $VerbosePreference variable from SilentlyContinue to Continue $VerbosePreference = 'continue' or you run an advanced function with the verbose flag

Write-Verbose "Task A has completed"

This is good for troubleshooting and showing progress in a script that does multiple tasks

Formatting Get-Date


        PS C:\> $D = Get-Date
        PS C:\> get-date $D -Format MMMM
        June
        PS C:\> get-date $D -Format MM
        06
        PS C:\> get-date $D -Format d
        15/06/2020
        PS C:\> get-date $D -Format dd
        15
        PS C:\> get-date $D -Format dddd
        Monday
        PS C:\> get-date $D -Format "MMMM dd, yyyy"
        June 15, 2020