Windows Server 2012 Automation with PowerShell Cookbook
上QQ阅读APP看书,第一时间看更新

Tuning PowerShell scripts for performance

In PowerShell, as with most things with computers, there is often more than one way to accomplish a task. Therefore the question is not always how to accomplish a task, it is how best to accomplish the task. Often times the answer comes down to how fast a certain method performs.

In this recipe, we will look at different methods to retrieve the local groups on a member server. The different methods will be benchmarked to determine the optimal method.

Getting ready

In this example, we will be listing the NT groups on the local computer. To do this we will be querying the Win32_Group WMI class. This class however, returns all local computer groups, as well all domain groups. If you have a domain environment with a large number of groups, this process can be extensive.

How to do it...

Carry out the following steps:

  1. Start by identifying different methods to list local groups on a computer:
    Get-WmiObject -Class Win32_Group | Where-Object Domain -eq $env:COMPUTERNAME 
    Get-WmiObject -Query "select * from Win32_Group where Domain='$env:ComputerName'"
  2. Benchmark the first task using Measure-Command:
    How to do it...
  3. Benchmark the second task using Measure-Command:
    How to do it...

How it works...

Both of these commands perform the same task, querying WMI for local groups on our server.

  • The first command retrieves all groups from WMI (local and domain), then filters based on the domain name attribute
  • The second command uses a query against WMI with a filter applied based on the domain name, WMI then returns the group objects to PowerShell

In this situation, the first command took several minutes to complete, while the second command took only 79 milliseconds. Both commands result in returning the same data, so this suggests the second method is more ideal for my current situation.

There's more...

Neither of these tasks is right nor wrong, they simply differ where the filtering process took place. However, the first method may be preferred based on what else is being done. For instance, if I was doing a large amount of work with groups and group membership, both in the domain and local system, the first method may be preferred.

If the results of the first WMI command were saved to a variable prior to filtering, then different filtering could be applied after. This one object could be filtered multiple times to provide different information, instead of requiring multiple queries against WMI.