Home > Blogs > VMware PowerCLI Blog

Updating the VMware PowerCLI Community Repository!

PowerCLI + GitHub
If you’ve ever tried searching for a script or a module before, you know it’s not the easiest thing to accomplish. This sentiment has been coming up more and more as of late. There’s a ton of amazing PowerCLI scripts and modules, PowerActions scripts, DSC resources, and so forth contributed by the community and openly available.

The VMware PowerCLI Community Repository is a central location where anyone can contribute their own resources. The repository features a Principles of Operations document to help guide contributors along the process of using, creating, and updating resources which are contained within the repository.

This community repository will also feature several community members as board members. As part of the board, they will be asked to help maintain the repository with tasks such as testing and providing feedback on all submitted resources, communicating with other board members in order to approve pull requests, and continuing to be good community advocates of PowerCLI and the community repository.

I’d like to thank and welcome the following board members:
Josh Atwell (Community Member)
Luc Dekens (Community Member)
Jonathan Medd (Community Member)
Alan Renouf (VMware)
Kyle Ruddy (VMware)
Rynardt Spies (Community Member)

Now that we have the announcements out of the way, let’s take a look at how to dig in and get started.

Getting Started

Accessing the Repository

Downloading the Repository for Local Access
If you happen to be new to GitHub and want to access the contents of the repository, one of the easiest ways to that is to just download a copy of it directly from GitHub to your local system:

  1. Load the following GitHub repository page: VMware PowerCLI Community Repository
  2. Click on the green “Clone or Download” button and then click “Download ZIP”
  3. Once downloaded, extract the zip file to the location of your choosing
  4. At this point, you now have a local copy of the repository

Download PowerCLI Repository

Creating Your Own GitHub Based Access Point
Another one of the easiest ways to access the repository contents is to “fork” it, which places a copy of the repository within your account:

  1. Login (or signup) to GitHub
  2. Load the following GitHub repository page: VMware PowerCLI Community Repository
  3. Click on the Fork button, which will create a copy of the repository and place it in the GitHub based location of your choosing.

Adding Resources

GitHub – Copy/Paste Option
If you happen to want to contribute a script or other resource and are new to GitHub, you have the ability to copy and paste your resource directly to the repository:

  1. Within the community repository, browse to the appropriate section (example: Scripts)
  2. Select the “Create new file” button
  3. On the new page, enter a file name, enter the resource’s information
  4. Within the “Commit new file” area, enter the title and description, then select “Create a new branch for this commit…” and enter a sensical branch name
  5. Click “Propose new file”
  6. On the “Open a pull request” page, click “Create pull request”

Submit to PowerCLI Repository

GitHub – Upload Files Option
Similarly to the copy and paste option above, you can also upload your resource directly to the repository as well:

  1. Within the community repository, browse to the appropriate section (example: Modules)
  2. Select the “Upload files” button
  3. On the new page, drag or choose the files to add
  4. Within the “Commit changes” area, enter the title and description, then select “Create a new branch for this commit…” and enter a sensical branch name
  5. Click “Propose new file”
  6. On the “Open a pull request” page, click “Create pull request”

GitHub Desktop Client

There are numerous other ways to interact with the community repository other than just the GitHub web interface. The GitHub Desktop is a great way to setup and streamline your interaction with any GitHub Repository. More information is available at GitHub’s Desktop Client Getting Started page.

GitHub Desktop Client


The goal of the VMware PowerCLI Community Repository is to bring the great PowerCLI resources from the community into a central location that’s easy to find, search, use, and contribute to regardless of the user’s technical skill level.

If there’s any questions, comments, or feedback, join us in the VMware Code Slack team’s PowerCLI channel: https://code.vmware.com/slack/

New PowerCLI Based Training Course!

VMware Education ServicesIt’s been a while since a new PowerCLI related course has been released by VMware Education, but they heard the requests and have released a new 5-day course! The course is titled “Data Center Automation with vRealize Orchestrator and vSphere PowerCLI” and will take experienced vSphere administrators down the path of automating their day to day tasks.

Attendees will gain a wealth of knowledge about PowerCLI and vRealize Orchestrator (vRO) based automation tips and tactics, regardless of their experience level. The course will set the ground work by covering some high level automation principles and then dives right in on the vSphere API. Upon learning the importance of the vSphere API as well as how it’s utilized, it’s PowerCLI time! Attendees will learn the basics, such as using the cmdlets, setting variables, and invoking PowerCLI object methods, then get into some more advanced concepts like accessing the underlying API and using the Onyx fling.

The rest of the course will cover vRO by making sure the attendees understand the basics, how to use and create workflows, how to tie in Windows PowerShell, and finally combining vRO and PowerCLI together to perform some guest operation activities.

The course is jam packed with lots of automation and PowerCLI goodness, and is certainly a must attend.

To find out more information and sign-up, head over to the VMware Education site’s for the Data Center Automation with vRealize Orchestrator and vSphere PowerCLI course.

Which Version of PowerCLI is Right For Me?

“I have PowerCLI 5.5 installed because I manage a vSphere 5.5 environment. I’ll update to PowerCLI 6.0 when I upgrade my vSphere environment to 6.0.”

Sound familiar? This is one of the most common things we hear during VMUGs, customer meetings, and around the community in general. This also happens to be a HUGE misconception. The current version is PowerCLI 6.3 Release 1 and it is compatible with all the supported vSphere versions!

Don’t take my word for it, check out the compatibility matrix:
PowerCLI Compatibility

As displayed in the compatibility matrix above, significant effort has been made to ensure backward compatibility while still being able to offer all of the latest and greatest updates and feature enhancements.

At this point you’re probably wondering what version of PowerCLI you’re using? Open up your PowerCLI window and have a look at the “Get-PowerCLIVersion” cmdlet:


PowerCLI is extremely backward compatible and we highly recommend upgrading to the latest version: PowerCLI 6.3 Release 1.

Take advantage of the following benefits:

  • Get-VM cmdlet optimizations
    Saying Get-VM is faster is just an understatement, some of the numbers we’ve received from the community are amazing!
  • Get-View cmdlet improvements
    Get-View now allows for tab completion of the -ViewType parameter
  • Added Content Library functionality
    The new Get-ContentLibraryItem cmdlet retrieves Content Library items as well as the ability to specify a Content Library item while using the New-VM cmdlet.
  • Get-ESXCLI improvements
    Major upgrade to the Get-ESXCLI cmdlet to now allow the passing of arguments by name instead of position simply by adding the -V2 parameter
  • Added PowerShell v5 and Windows 10 support
  • Added support for the following VMware products: vCloud Director 8.0 and vRealize Operations Manager 6.2

A couple notable resolved issues:

  • Get-VM
    If you try to run Get-VM without specifying any parameters, you might receive an error message of type Value cannot be null.
  • Export-EsxImageProfile
    If you try to export an image profile, you receive an error message of type Cannot instantiate ‘certified’ policy: VibSign module missing.
  • New-DeployRule
    If you try to create a new deploy rule by passing absolute values of host profle, cluster, datacenter, or folder instead of passing the objects, you receive an error message of type Cannot process argument transformation on parameter ‘Item’. Unsupported version URI urn:rbd1/3.0.

For more information on changes made in vSphere PowerCLI 6.3 Release 1, including improvements, security enhancements, and deprecated features, see the vSphere PowerCLI Change Log. For more information on specific product features, see the VMware vSphere PowerCLI 6.3 Release 1 User’s Guide. For more information on specific cmdlets, see the VMware vSphere PowerCLI 6.3 Release 1 Cmdlet Reference.

Upgrade by heading over to the vSphere PowerCLI page and downloading it today!

Welcome a new face to the team


3TSeV8RqYou are about to see new and exciting blog posts arrive from a fresh face on the team.  Please do join me in welcoming the new Technical Marketing expert on all things PowerCLI – Kyle Ruddy.

Kyle works as part of our Technical Marketing team, being responsible for vSphere Operations Management and will also cover APIs / SDKs and CLIs.

Kyle has been a big fan of PowerCLI, and automation in general, having technically reviewed PowerCLI books, presented PowerCLI based VMUG sessions, and been a strong community contributor. Kyle’s focus will be to continue evangelizing PowerCLI and its use to help VMware customers increase their productivity and consistency and to bring you the latest and greatest in news and new ways to use PowerCLI.

During his spare time, Kyle enjoys golfing, SCUBA diving, and most motorsports activities.


You can find Kyle’s personal blog at http://thatcouldbeaproblem.com and can contact him on twitter via @kmruddy

Blogger Talk Show–Pilot Episode on PowerCLI

Here at VMware we are always trying to make sure we give you the information you need in a way that you can best consume it.

With this in mind, a little while ago I was asked to take part in a pilot for a new talk show VMware is looking to gain feedback on, this gives us the chance to give you more information in a less formal way and you to learn more about a given subject.

The initial talk show is a little rough around the edges but please do take 30 minutes out of your busy schedule to check it out and perhaps learn a little more about PowerCLI and how to work with VMs in particular.

Watch the video

Continue reading

Using the entire API for vRealize Operations via PowerCLI

Previously we showed you how to use the useful cmdlets available with the PowerCLI vRealize Operations Manager (vR Ops) module, but as we also explained there are only a few cmdlets at the moment and anyone who knows vR Ops will know that there is a lot more functionality than is provided by those cmdlets.

But don’t worry, it is possible to access the entire vR Ops REST API!  PowerCLI gives us the ability to expand the capability of the module to perform many more tasks that aren’t available via the included cmdlets.

In this blog post, which is a continuation of my previous blog posts on the PowerCLI vR Ops module, I will explain how to access the entire vR Ops public REST API via PowerCLI.  Before I begin, it will be helpful to cover some basic information about the vR Ops REST API.

The API is available via the base URI of https://{vrops-IP}/suite-api and if you browse to this link the documentation is available.  For the most part, the API is pretty well documented with examples for usage including payloads for XML and JSON.  Below is a screenshot of the XML request body example for the performAction method.

clip_image002 Continue reading

Working with Recommendations and Statistics in vR OPs with PowerCLI

In our previous post you learned how to get started with using PowerCLI against vR Ops and how to use the cmdlets to work with alerts, in this post we take you a step further an learn how to take the work from the previous post and use it with Recommendations and Statistics from vR Ops.

As part of an alert which we discussed previously, vR Ops provides recommendations that guide you to possible solutions. These recommendations are available as well via the Get-OMRecommendation cmdlet. Continuing with the example, now that I have taken ownership of an alert I can easily grab the recommendation.


Continue reading

Getting started with PowerCLI for vRealize Operations (vR OPs)

I recently took some time to explore the PowerCLI module for vRealize Operations Manager (vR Ops). This module was released with PowerCLI 6.0 R2 last year and I can say that after a test drive I am really impressed at the capabilities of this new module. A useful set of cmdlets are provided and the entire vR Ops public API is accessible through this module.

In this blog post, I will cover some of the basics of the module and give some examples of usage including programmatically resolving an alert condition on a virtual machine. In these examples I am using PowerCLI 6.3 Release 1 with vRealize Operations Manager 6.2. I will follow this up with a more in-depth blog post explaining how the vR Ops API can be leveraged via PowerCLI.

To begin, the available cmdlets for the module (which is named “VMware.VimAutomation.vROps”) are shown below.

Continue reading

New Book: PowerCLI Essentials by Chris Halverson

What angle does this book give on PowerCLI?

imageThe book covers where to get PowerCLI and its history, including version differences and their change logs. Developing single line scripts into longer ones, reusable code and how to document your scripting.

Bridging scripts that pull key components of VMware scripting and incorporating Windows based calls in the same script, an introduction to vRealize Orchestrator and PowerShell Workflows and lastly incorporating PowerShell into other VMware products.

Who should buy this book, beginners, experts or all?

As this is an essentials book, the intended audience is the beginners to intermediate skill set, although I hope some points will be useful to even the most seasoned PowerShell scripter. This being said the ideal reader will be the VMware Administrator or the Windows Administrator that works with VMware products on a daily basis.

Where do we find the book



PACKT Website

Continue reading

PowerCLI 6.3 R1: Get-ESXCLI Why the V2?

If you have installed the latest release of PowerCLI (6.3 R1) then you may have noticed a warning if you have run the Get-ESXCLI cmdlet that looks a little like this:


What does it mean?

Whilst talking to the community and listening to our customers we heard that there were a couple of issues with this cmdlet, some that lead to problems with scripts breaking when being used against environments that have more than one version of ESX or maybe upgraded versions of ESX using older scripts with this cmdlet.  Lets take a bi of a deeper dive into these issues so you can understand why we made the change and how the new –V2 version is so much better!

Lets discuss the 2 main problems….

1. Positional values and the $null variable

When using the Get-ESXCLI cmdlet we would only allow invocation based on positional parameters, this was somewhat painful as providing just 1 parameter for a esxcli which had 15 options would result in long, weird looking scripts with a lot of $null parameters to fill the blanks, it was hard to work out which parameters where needed and where they fit in between the $null entires.  Lets take a look at the “ESXCLI network diag ping” namespace for example, to call this namespace and ping a given address twice in ESXCLI you would need to call the namespace with a –count and a –host option as per the docs here.  We would have had to find out where to put these when calling the Get-ESXCLI cmdlet and where to add the $null for everything we didn’t want to use.

Once done we would end up with a script which may look like the following:

$esxcli = Get-ESXCLI -VMHost (Get-VMhost | Select -first 1)


Not the most intuitive way to do things but it worked right?! Well, yeah kind of but that leads us to problem 2…

2.  Mixed environments or upgraded environments

One of the rules for updating ESXCLI namespaces is that you are allowed to add options but not remove or modify existing ones, this stops breaking changes for anyone using ESXCLI in a script, the issue was that when people were using these through PowerCLI and potentially using it against multiple hosts of different versions we could have a different number of $null parameters as we need one for every parameter we don’t use.

For example, we may have the following example in ESX 5.1:

$esxcli = Get-ESXCLI -VMHost (Get-VMhost | Select -first 1)


This may work fine but then what if we at VMware extending this namespace to give it an extra option, we would need an extra $null through Get-ESXCLI, so for example in ESX 5.5 this may be:

$esxcli = Get-ESXCLI -VMHost (Get-VMhost | Select -first 1)


As you can see, if we ran either the 5.1 version against a 5.5 hosts or the 5.5 version against the 5.1 host we would have errors and broken scripts.  Of course you could check for each version but this starts to get complex when sharing scripts for others to use and the multiple versions of esxcli namespaces we have out there.

So what does V2 do that’s different?

The Get-ESXCLI cmdlet has now been updated with a –V2 parameter which supports specifying method arguments by name, essentially we are able to fix both issues above and provide an easier way to explore what an ESXCLI namespace requires and allow us to provide only the items we care about, lets walk though the same example but using the –V2 switch

Firstly lets store the new version in a variable like we did above:

$esxcli2 = Get-ESXCLI -VMHost (Get-VMhost | Select -first 1) -V2

Next we can find out what options are available to set for the namespace by calling the new CreateArgs method and storing this in a variable:

$arguments = $esxcli2.network.diag.ping.CreateArgs()

Now we can see what’s in the variable by calling it:

PowerCLI C:\> $arguments

Name                           Value
—-                           —–
host                           Unset, ([string], optional)
wait                           Unset, ([string], optional)
df                             Unset, ([boolean], optional)
interval                       Unset, ([string], optional)
ttl                            Unset, ([long], optional)
debug                          Unset, ([boolean], optional)
nexthop                        Unset, ([string], optional)
count                          Unset, ([long], optional)
netstack                       Unset, ([string], optional)
size                           Unset, ([long], optional)
ipv4                           Unset, ([boolean], optional)
ipv6                           Unset, ([boolean], optional)
interface                      Unset, ([string], optional)

As you can see, its helped us out here, it has prefilled this array with the options we can specify, now all we need to do is assign values to the entries we want to use:

$arguments.count = 2

$arguments.host = “”

If we look at what’s in the variable again we can see we have set just the two entries we need:

PowerCLI C:\> $arguments

Name                           Value
—-                           —–
wait                           Unset, ([string], optional)
df                             Unset, ([boolean], optional)
interval                       Unset, ([string], optional)
ttl                            Unset, ([long], optional)
debug                          Unset, ([boolean], optional)
nexthop                        Unset, ([string], optional)
count                          2
netstack                       Unset, ([string], optional)
size                           Unset, ([long], optional)
ipv4                           Unset, ([boolean], optional)
ipv6                           Unset, ([boolean], optional)
interface                      Unset, ([string], optional)

Next all we need to do is send these options back by using the Invoke method and providing our set $arguments variable:


lets put this together so you can see how easy this is now:

$esxcli2 = Get-ESXCLI -VMHost (Get-VMhost | Select -first 1) -V2

$arguments = $esxcli2.network.diag.ping.CreateArgs()

$arguments.count = 2

$arguments.host = “”



As you can see, not only is this much easier to understand but we also don’t have to use lots of $null entries and it will also work against multiple versions of ESXi or allow you to share your scripts knowing that they will work against any version of ESXi that supports the namespaces you used in ESXCLI.

A Win, Win situation here, so why wouldn’t you use the –V2 option?!