VMware Powercli Module

This topic contains 3 replies, has 2 voices, and was last updated by Profile photo of Don Jones Don Jones 3 years, 3 months ago.

  • Author
    Posts
  • #12330
    Profile photo of Apurv Mahale
    Apurv Mahale
    Participant

    How to import VMware powercli snap-in automatically? Also I want the snap-in to be imported as a "Module" in PowerShell ISE

    P.S.: I am newbie to Powershell. Requesting SOS with PowerCLI.

  • #12331
    Profile photo of Don Jones
    Don Jones
    Keymaster

    You would write a profile script. Those run each time you start the associated hosting application. You would put the Add-PSSnapin command (for example) in the profile. Run "help about_profile*" in the shell to read about profile scripts.

    There's no way to make a snap-in "imported as a Module." I'm not sure what you mean by that. Modules and snap ins are different things.

  • #12353
    Profile photo of Apurv Mahale
    Apurv Mahale
    Participant

    But read some blogs and even experienced that merely running "add-PSSnapin vim.automation.core" adds the snap-in powershell. But doesn't work as it works in Powercli Profile. Below is a script, these scripts run while launching the Powercli application. I would be very thankful if you could read these and help with one script, which if executed, would load the same snap-in or module in ISE.

    This is in the Target Space: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -psc "C:\Program Files (x86)\VMware\Infrastructure\vSphere PowerCLI\vim.psc1" -noe -c ". \"C:\Program Files (x86)\VMware\Infrastructure\vSphere PowerCLI\Scripts\Initialize-PowerCLIEnvironment.ps1\""

    SCRIPT 1: vim.psc1
    < ?xml version="1.0" encoding="utf-8"?> 1.0

    SCRIPT 2: Initialize-PowerCLIEnvironment.ps1

    #######################################################################################################################
    # This file will be removed when PowerCLI is uninstalled. To make your own scripts run when PowerCLI starts, create a
    # file named "Initialize-PowerCLIEnvironment_Custom.ps1" in the same directory as this file, and place your scripts in
    # it. The "Initialize-PowerCLIEnvironment_Custom.ps1" is not automatically deleted when PowerCLI is uninstalled.
    #######################################################################################################################

    $productName = "vSphere PowerCLI"
    $productShortName = "PowerCLI"
    $version = Get-PowerCLIVersion
    $windowTitle = "VMware $productName {0}.{1}" -f $version.Major, $version.Minor
    $host.ui.RawUI.WindowTitle = "$windowTitle"
    $CustomInitScriptName = "Initialize-PowerCLIEnvironment_Custom.ps1"
    $currentDir = Split-Path $MyInvocation.MyCommand.Path
    $CustomInitScript = Join-Path $currentDir $CustomInitScriptName

    #returns the version of Powershell
    # Note: When using, make sure to surround Get-PSVersion with parentheses to force value comparison
    function Get-PSVersion {
    if (test-path variable:psversiontable) {
    $psversiontable.psversion
    } else {
    [version]"1.0.0.0"
    }
    }

    # Returns the path (with trailing backslash) to the directory where PowerCLI is installed.
    function Get-InstallPath {
    $regKeys = Get-ItemProperty "hklm:\software\VMware, Inc.\VMware vSphere PowerCLI" -ErrorAction SilentlyContinue

    #64bit os fix
    if($regKeys -eq $null){
    $regKeys = Get-ItemProperty "hklm:\software\wow6432node\VMware, Inc.\VMware vSphere PowerCLI" -ErrorAction SilentlyContinue
    }

    return $regKeys.InstallPath
    }

    # Loads additional snapins and their init scripts
    function LoadSnapins(){
    $snapinList = @( "VMware.VimAutomation.Core", "VMware.VimAutomation.Vds", "VMware.VimAutomation.License", "VMware.DeployAutomation", "VMware.ImageBuilder", "VMware.VimAutomation.Cloud")

    $loaded = Get-PSSnapin -Name $snapinList -ErrorAction SilentlyContinue | % {$_.Name}
    $registered = Get-PSSnapin -Name $snapinList -Registered -ErrorAction SilentlyContinue | % {$_.Name}
    $notLoaded = $registered | ? {$loaded -notcontains $_}

    foreach ($snapin in $registered) {
    if ($loaded -notcontains $snapin) {
    Add-PSSnapin $snapin
    }

    # Load the Intitialize-.ps1 file
    # File lookup is based on install path instead of script folder because the PowerCLI
    # shortuts load this script through dot-sourcing and script path is not available.
    $filePath = "{0}Scripts\Initialize-{1}.ps1" -f (Get-InstallPath), $snapin.ToString().Replace(".", "_")
    if (Test-Path $filePath) {
    & $filePath
    }
    }
    }
    LoadSnapins

    # Update PowerCLI version after snap-in load
    $version = Get-PowerCLIVersion
    $windowTitle = "VMware $productName {0}.{1} Release 1" -f $version.Major, $version.Minor
    $host.ui.RawUI.WindowTitle = "$windowTitle"

    function global:Get-VICommand([string] $Name = "*") {
    get-command -pssnapin VMware.* -Name $Name
    }

    function global:Get-LicensingCommand([string] $Name = "*") {
    get-command -pssnapin VMware.VimAutomation.License -Name $Name
    }

    function global:Get-ImageBuilderCommand([string] $Name = "*") {
    get-command -pssnapin VMware.ImageBuilder -Name $Name
    }

    function global:Get-AutoDeployCommand([string] $Name = "*") {
    get-command -pssnapin VMware.DeployAutomation -Name $Name
    }

    # Launch text
    write-host " Welcome to the VMware $productName!"
    write-host ""
    write-host "Log in to a vCenter Server or ESX host: " -NoNewLine
    write-host "Connect-VIServer" -foregroundcolor yellow
    write-host "To find out what commands are available, type: " -NoNewLine
    write-host "Get-VICommand" -foregroundcolor yellow
    write-host "To show searchable help for all PowerCLI commands: " -NoNewLine
    write-host "Get-PowerCLIHelp" -foregroundcolor yellow
    write-host "Once you've connected, display all virtual machines: " -NoNewLine
    write-host "Get-VM" -foregroundcolor yellow
    write-host "If you need more help, visit the PowerCLI community: " -NoNewLine
    write-host "Get-PowerCLICommunity" -foregroundcolor yellow
    write-host ""
    write-host " Copyright (C) 1998-2013 VMware, Inc. All rights reserved."
    write-host ""
    write-host ""

    # Error message to update to version 2.0 of PowerShell
    # Note: Make sure to surround Get-PSVersion with parentheses to force value comparison
    if((Get-PSVersion) -lt "2.0"){
    $psVersion = Get-PSVersion
    Write-Error "$productShortName requires Powershell 2.0! The version of Powershell installed on this computer is $psVersion." -Category NotInstalled
    }

    # Modify the prompt function to change the console prompt.
    # Save the previous function, to allow restoring it back.
    $originalPromptFunction = $function:prompt
    function global:prompt{

    # change prompt text
    Write-Host "$productShortName " -NoNewLine -foregroundcolor Green
    Write-Host ((Get-location).Path + ">") -NoNewLine
    return " "
    }

    # Tab Expansion for parameters of enum types.
    # This functionality requires powershell 2.0
    # Note: Make sure to surround Get-PSVersion with parentheses to force value comparison
    if((Get-PSVersion) -eq "2.0"){

    #modify the tab expansion function to support enum parameter expansion
    $global:originalTabExpansionFunction = $function:TabExpansion

    function global:TabExpansion {
    param($line, $lastWord)

    $originalResult = & $global:originalTabExpansionFunction $line $lastWord

    if ($originalResult) {
    return $originalResult
    }
    #ignore parsing errors. if there are errors in the syntax, try anyway
    $tokens = [System.Management.Automation.PSParser]::Tokenize($line, [ref] $null)

    if ($tokens)
    {
    $lastToken = $tokens[$tokens.count - 1]

    $startsWith = ""

    # locate the last parameter token, which value is to be expanded
    switch($lastToken.Type){
    'CommandParameter' {
    #... -Parameter

    $paramToken = $lastToken
    }
    'CommandArgument' {
    #if the last token is argument, that can be a partially spelled value
    if($lastWord){
    #... -Parameter Argument < << partially spelled argument, $lastWord == Argument #... -Parameter Argument Argument $startsWith = $lastWord $prevToken = $tokens[$tokens.count - 2] #if the argument is not preceeded by a paramter, then it is a value for a positional parameter. if ($prevToken.Type -eq 'CommandParameter') { $paramToken = $prevToken } } #else handles "... -Parameter Argument" and "... -Parameter Argument Argument" >>> which means the argument is entirely spelled
    }
    }

    # if a parameter is found for the argument that is tab-expanded
    if ($paramToken) {
    #locates the 'command' token, that this parameter belongs to
    [int]$groupLevel = 0
    for($i=$tokens.Count-1; $i -ge 0; $i--) {
    $currentToken = $tokens[$i]
    if ( ($currentToken.Type -eq 'Command') -and ($groupLevel -eq 0) ) {
    $cmdletToken = $currentToken
    break;
    }

    if ($currentToken.Type -eq 'GroupEnd') {
    $groupLevel += 1
    }
    if ($currentToken.Type -eq 'GroupStart') {
    $groupLevel -= 1
    }
    }

    if ($cmdletToken) {
    # getting command object
    $cmdlet = Get-Command $cmdletToken.Content
    # gettint parameter information
    $parameter = $cmdlet.Parameters[$paramToken.Content.Replace('-','')]

    # getting the data type of the parameter
    $parameterType = $parameter.ParameterType

    if ($parameterType.IsEnum) {
    # if the type is Enum then the values are the enum values
    $values = [System.Enum]::GetValues($parameterType)
    } elseif($parameterType.IsArray) {
    $elementType = $parameterType.GetElementType()

    if($elementType.IsEnum) {
    # if the type is an array of Enum then values are the enum values
    $values = [System.Enum]::GetValues($elementType)
    }
    }

    if($values) {
    if ($startsWith) {
    return ($values | where { $_ -like "${startsWith}*" })
    } else {
    return $values
    }
    }
    }
    }
    }
    }
    }

    # Opens documentation file
    function global:Get-PowerCLIHelp{
    $ChmFilePath = Join-Path (Get-InstallPath) "VICore Documentation\$productName Cmdlets Reference.chm"
    $docProcess = [System.Diagnostics.Process]::Start($ChmFilePath)
    }

    # Opens toolkit community url with default browser
    function global:Get-PowerCLICommunity{
    $link = "http://communities.vmware.com/community/vmtn/vsphere/automationtools/windows_toolkit"
    $browserProcess = [System.Diagnostics.Process]::Start($link)
    }

    # Find and execute custom initialization file
    $existsCustomInitScript = Test-Path $CustomInitScript
    if($existsCustomInitScript) {
    & $CustomInitScript
    }

  • #12355
    Profile photo of Don Jones
    Don Jones
    Keymaster

    Unfortunately, no, I can't read through a script of that size and tell you what's wrong with it.

    It's likely that PowerCli is typically loaded through a script, which may also define functions, variables, and other items. You'd probably get a better answer to your question in the PowerCli forums on Vmware's community site. We regularly refer people there, in fact.

You must be logged in to reply to this topic.