Powershell 操作hyper-v 一般性操…

Powershell 操作hyper-v 一般性操作

 

1. 启动

view plain
  1. $hostServer = "shlihu-2k8r2";  
  2. $vmName="Win7-Pro2";  
  3.   
  4. function GetImageState   
  5.  {   
  6.       param  
  7.       (  
  8.         [string]$image = $(throw "param -image is required."),  
  9.         [string]$hostServer = $(throw "param -hostserver is required.")  
  10.       )  
  11.       $virtualMachines = Get-WmiObject -Class "MSVM_ComputerSystem" -Namespace "root\virtualization" -ComputerName $hostServer;  
  12.       foreach ($virtualMachine in $virtualMachines)  
  13.       {  
  14.        if ($image -ieq $virtualMachine.ElementName)  
  15.        {  
  16.         return $virtualMachine.EnabledState;  
  17.        }  
  18.       }  
  19.       throw "Cannot get the state of image [$image] on host server [$hostServer]";  
  20.  }  
  21.    
  22.  function WaitImageToState  
  23.  {  
  24.       param  
  25.       (  
  26.        [string]$image = $(throw "param -image is required."),  
  27.        [string]$hostServer = $(throw "param -hostserver is required."),  
  28.        [int]$state = $(throw "param -$state is required."),       
  29.        [int]$timeOut = $(throw "param -$timeOut is required.")  
  30.       )   
  31.       do  
  32.       {   
  33.        $timeOut = $timeOut - 5;  
  34.        sleep (5);  
  35.        $currentState = GetImageState -image:$image -hostserver:$hostServer;  
  36.        if ($currentState -eq $state)  
  37.        {  
  38.         return;  
  39.        }  
  40.          
  41.        if ($timeOut -le 0)  
  42.        {  
  43.         throw "Wait for image [$image] to state [$state] time out.";  
  44.        }    
  45.       }while($true);  
  46.  }  
  47.    
  48.  "Start up the virtual machine..." + $hostServer  
  49.  Set-ExecutionPolicy -ExecutionPolicy RemoteSigned  
  50.  $virtualMachines = Get-WmiObject -Class "MSVM_ComputerSystem" -Namespace "root\virtualization" -ComputerName $hostServer;  
  51.  $virtualMachineRun = 2;  
  52.  foreach ($virtualMachine in $virtualMachines)  
  53.  {  
  54.   if($virtualMachine.ElementName -eq $vmName)  
  55.   {  
  56.    $result = $virtualMachine.RequestStateChange($virtualMachineRun);  
  57.    if ($result.ReturnValue -ne 4096)  
  58.    {  
  59.     throw "Failed to send start request to VM - " + $virtualMachine;  
  60.    }    
  61.    WaitImageToState -image:$virtualMachine.ElementName -hostserver:$hostServer -state:$virtualMachineRun -timeOut:60;  
  62.   }  
  63.  }  
  64.  $vmName + "startup Finished!"  


2.  关闭

 

view plain
  1. $hostServer = "shlihu-2k8r2";  
  2. $vmName="Win7-Pro2";  
  3.   function GetImageState   
  4.  {   
  5.       param  
  6.       (  
  7.        [string]$image = $(throw "param -image is required."),  
  8.        [string]$hostServer = $(throw "param -hostserver is required.")  
  9.       )  
  10.       $virtualMachines = Get-WmiObject -Class "MSVM_ComputerSystem" -Namespace "root\virtualization" -ComputerName $hostServer;  
  11.       foreach ($virtualMachine in $virtualMachines)  
  12.       {  
  13.        if ($image -ieq $virtualMachine.ElementName)  
  14.        {  
  15.         return $virtualMachine.EnabledState;  
  16.        }  
  17.       }  
  18.       throw "Cannot get the state of image [$image] on host server [$hostServer]";  
  19.  }  
  20.    
  21.  function WaitImageToState  
  22.  {  
  23.       param  
  24.       (  
  25.        [string]$image = $(throw "param -image is required."),  
  26.        [string]$hostServer = $(throw "param -hostserver is required."),  
  27.        [int]$state = $(throw "param -$state is required."),  
  28.        [int]$timeOut = $(throw "param -$timeOut is required.")  
  29.       )   
  30.       do  
  31.       {   
  32.        $timeOut = $timeOut - 5;  
  33.        sleep (5);  
  34.        $currentState = GetImageState -image:$image -hostserver:$hostServer;  
  35.        if ($currentState -eq $state)  
  36.        {  
  37.         return;  
  38.        }  
  39.          
  40.        if ($timeOut -le 0)  
  41.        {  
  42.         throw "Wait for image [$image] to state [$state] time out.";  
  43.        }    
  44.       }while($true);  
  45.  }  
  46.    
  47.  "Shutdown the virtual machine..."  
  48.  Set-ExecutionPolicy -ExecutionPolicy RemoteSigned  
  49.  $virtualMachines = Get-WmiObject -Class "MSVM_ComputerSystem" -Namespace "root\virtualization" -ComputerName $hostServer;  
  50.  $virtualMachineRun = 3;  
  51.  foreach ($virtualMachine in $virtualMachines)  
  52.  {  
  53.   if($virtualMachine.ElementName -eq $vmName)  
  54.   {  
  55.    $result = $virtualMachine.RequestStateChange($virtualMachineRun);  
  56.    if ($result.ReturnValue -ne 4096)  
  57.    {  
  58.     throw "Failed to send start request to VM - " + $virtualMachine;  
  59.    }    
  60.    WaitImageToState -image:$virtualMachine.ElementName -hostserver:$hostServer -state:$virtualMachineRun -timeOut:60;  
  61.   }  
  62.  }  
  63.  $vmName + "Shutdown Finished!"  


3. 获取虚拟机状态

view plain
  1. $hostServer = "shlihu-2k8r2";  
  2. $vmName="Win7-Pro2";  
  3. $status = -1   
  4.  $virtualMachines = Get-WmiObject -Class "MSVM_ComputerSystem" -Namespace "root\virtualization" -ComputerName $hostServer   
  5.  foreach ($virtualMachine in $virtualMachines)  
  6.  {  
  7.      if ($vmName -ieq $virtualMachine.ElementName)  
  8.      {  
  9.          $status = $virtualMachine.EnabledState  
  10.          break  
  11.      }  
  12.  }  
  13.    
  14.  switch($status)  
  15.  {  
  16.      -1    {throw "Cannot get the state of vmName [$vmName] on host server [$hostServer]"}  
  17.      2     {"Running."}  
  18.      3     {"Closed."}   
  19.      32768 {"Paused."}   
  20.      32769 {"Saved."}   
  21.      32770 {"Starting."}   
  22.      32773 {"Saving."}   
  23.      32774 {"Stopping."}   
  24.      32776 {"Pausing."}  
  25.      32777 {"Restoring."}   
  26.      default {"Unknow Status."}  
  27.  }  


4. 获取snapshot列表

view plain
  1. $hostServer = "shlihu-2k8r2";  
  2. $vmName="Win7-Pro2";  
  3.   
  4. $virtualMachines = Get-WmiObject -Class "MSVM_ComputerSystem" -Namespace "root\virtualization" -ComputerName $hostServer;   
  5.  foreach ($virtualMachine in $virtualMachines)   
  6.  {     
  7.      if($virtualMachine.ElementName -eq $vmName)  
  8.      {  
  9.          # get snapshots of the virtual machine  
  10.          $queryStr = "SELECT * FROM Msvm_VirtualSystemSettingData WHERE SystemName='" + $virtualMachine.Name + "' and SettingType=5";  
  11.          $snapShots = Get-WmiObject -Query $queryStr -Namespace "root\virtualization" -ComputerName $hostServer;  
  12.    
  13.          foreach ($aSnapShot in $snapShots)  
  14.          {  
  15.             $aSnapShot.ElementName  
  16.             [System.DateTime]::ParseExact($aSnapShot.CreationTime.Substring(0,14), "yyyyMMddHHmmss", $null).ToLocalTime().ToString()  
  17.             $aSnapShot.Notes  
  18.          }  
  19.      }  
  20.  }  


5. 恢复snapshot

view plain
  1. $hostServer = "shlihu-2k8r2";  
  2. $vmName="Win7-Pro2";  
  3. $snapshotName ="Win7-Pro2 -VS2010-Silk2010r2-Completed-Install"  
  4. function GetImageState   
  5.  {  
  6.   param  
  7.   (  
  8.    [string]$image = $(throw "param -image is required."),  
  9.    [string]$hostServer = $(throw "param -hostserver is required.")  
  10.   )  
  11.   $virtualMachines = Get-WmiObject -Class "MSVM_ComputerSystem" -Namespace "root\virtualization" -ComputerName $hostServer;  
  12.   foreach ($virtualMachine in $virtualMachines)  
  13.   {  
  14.    if ($image -ieq $virtualMachine.ElementName)  
  15.    {  
  16.     return $virtualMachine.EnabledState;  
  17.    }  
  18.   }  
  19.   throw "Cannot get the state of image [$image] on host server [$hostServer]";  
  20.  }  
  21.    
  22.  function WaitImageToState  
  23.  {  
  24.   param  
  25.   (  
  26.    [string]$image = $(throw "param -image is required."),  
  27.    [string]$hostServer = $(throw "param -hostserver is required."),  
  28.    [int]$state = $(throw "param -$state is required."),  
  29.    [int]$timeOut = $(throw "param -$timeOut is required.")  
  30.   )   
  31.   do  
  32.   {   
  33.    $timeOut = $timeOut - 5;  
  34.    sleep (5);  
  35.    $currentState = GetImageState -image:$image -hostserver:$hostServer;  
  36.    if ($currentState -eq $state)  
  37.    {  
  38.     return;  
  39.    }  
  40.      
  41.    if ($timeOut -le 0)  
  42.    {  
  43.     throw "Wait for image [$image] to state [$state] time out.";  
  44.    }    
  45.   }while($true);  
  46.  }  
  47.    
  48.  "Rollback the virtual machine..."  
  49.  $virtualMachines = Get-WmiObject -Class "MSVM_ComputerSystem" -Namespace "root\virtualization" -ComputerName $hostServer;  
  50.  $virtualSystemService = Get-WmiObject -Class "Msvm_VirtualSystemManagementService" -Namespace "root\virtualization" -ComputerName $hostServer;  
  51.  foreach ($virtualMachine in $virtualMachines)  
  52.  {     
  53.   if($virtualMachine.ElementName -eq $vmName)  
  54.   {  
  55.    # get snapshot of the virtual machine  
  56.    $queryStr = "SELECT * FROM Msvm_VirtualSystemSettingData WHERE SystemName='" + $virtualMachine.Name + "' and SettingType=5";  
  57.    $snapShots = Get-WmiObject -Query $queryStr -Namespace "root\virtualization" -ComputerName $hostServer;  
  58.    foreach ($aSnapShot in $snapShots)  
  59.    {  
  60.     # revert to specified snapshot  
  61.     if ($aSnapShot.ElementName -ieq $snapshotName)  
  62.     {  
  63.      # apply snapshot  
  64.      $result = $virtualSystemService.ApplyVirtualSystemSnapShot($virtualMachine.__PATH, $aSnapShot.__PATH);  
  65.      if ($result.ReturnValue -ne 0)  
  66.      {  
  67.       throw "Failed to apply snapshot ["+$snapshotName+"] to VM ["+$image+"]";  
  68.      }         
  69.      WaitImageToState -image:$virtualMachine.ElementName -hostserver:$hostServer -state:32769 -timeOut:120;  
  70.     }  
  71.    }  
  72.   }  
  73.  }  
  74.  "Finished rollback!"  

6. 网络操作

 使用powershell重启网络(非常有用)

 Import-Module tr*
Get-TroubleshootingPack C:\Windows\diagnostics\system\Networking | Invoke-TroubleshootingPack -Unattended 

 http://msdn.microsoft.com/en-us/library/dd323718

http://blogs.technet.com/b/heyscriptingguy/archive/2011/02/09/use-powershell-troubleshooting-packs-to-diagnose-remote-problems.aspx

http://blogs.msdn.com/b/dimeby8/archive/2009/06/10/change-unidentified-network-from-public-to-work-in-windows-7.aspx

你可能感兴趣的:(Powershell 操作hyper-v 一般性操…)