View Only
  • 1.  Argument with InvokeVMScript

    Posted Aug 29, 2012 04:23 PM

    I have two questions regarding InvokeVMscript - I have written a short script, but I couldn't code the quotes in the script. I tried to escape the quote but it didn't work. Ultimately I want to avoid typing the quotes on the arguments - myscript vmname "uname -a".

    Part of the script:


    Invoke-VMScript -ScriptText $script -VM $vm -HostUser root -HostPassword $hostpasswd -GuestUser root -GuestPassword $guestpasswd

    I found some code that can query vm tools status, how can I intergate them so Invoke-VMScript only execute if vmware tools is running?

    Get-VM | select Name,
        @{N="Tools Status";E={
            if($_.Guest.Extensiondata.GuestState -eq "notRunning"){
                "Not running"        }
                $_.Guest.Extensiondata.ToolsVersionStatus.Replace("guestToolsNeedUpgrade","Out of date").Replace("guestToolsNotInstalled","Not installed").Replace("guestToolsCurrent","OK").Replace("guestToolsUnmanaged","Unmanaged")

  • 2.  RE: Argument with InvokeVMScript

    Posted Sep 05, 2012 02:37 AM

    Hello, mazdajai-

    For the first part, one way that you could pass the script string to the myScript.ps1 as a parameter would be to have the script text itself as a variable.  For example:

    ## store the script text for Invoke-VMScript in a variable
    $strScriptTxt = 'uname -a'
    ## call the PowerShell script with the two parameters
    myScript.ps1 myVMName $strScriptTxt

    As for how to only try to run something on VMs that have Tools running, you could do something like:

    Get-VM | ?{$_.ExtensionData.Guest.ToolsRunningStatus -eq "guestToolsRunning"} | %{
    ## do stuff here
        Invoke-VMScript -VM $_ -GuestCredential ... ## and so on
    } ## end foreach-object

    How does that do?