2013/11/11

Convert-VMGeneration.ps1 を日本語対応にする

Windows Server 2012 R2 Hyper-V の仮想マシンの種類を第 1 世代から第 2 世代に変換してくれる、Convert-VMGeneration.ps1 っていうステキなツールがあります。

Hyper-V generation 2 VM conversion utility (Convert-VMGeneration)
[URL] http://code.msdn.microsoft.com/windowsdesktop/Convert-VMGeneration-81ddafa2

ですが、日本語環境だとこんなエラーが出ます。→ MCP の憂鬱さんのサイト



エラーが出ているのは元の仮想マシンの統合サービス (時刻の同期とか...)  の設定を、変換後の仮想マシンの設定に移行するところ。次のようなコマンドレットが実行されちゃってエラー (エラーの理由は上のメッセージのとおり) になるんで、VSS 以外は設定が引き継がれません。

Enable/Disable-VMIntegrationService -Name "時刻の同期" -VM ...
Enable/Disable-VMIntegrationService -Name "ハートビート" -VM ...
Enable/Disable-VMIntegrationService -Name "キー値ペア交換" -VM ...
Enable/Disable-VMIntegrationService -Name "シャットダウン" -VM ...
Enable/Disable-VMIntegrationService -Name "ゲスト サービス インターフェイス " -VM ... 

変換は完了するので、統合サービスの設定を既定のまま変えてなければこのエラーは無視していいですし、手動で設定を移行すれば、それはそれで問題なしです。

エラーの理由を踏まえて、ちょちょちょいと Convert-VMGeneration.ps1 を修正すると、こんな感じで日本語環境でも問題なく動くようになります。

日本語環境に対応させるために変更したコードはこちら。美しくないですが。
------------------------------------------------------------------------------
        #Integration Services
        #Write-Info " - Integration Services..."
        #$ICs = Get-VMIntegrationService $SourceVM
        #ForEach ($IC in $ICS) {
        #   if ($IC.Enabled) {
        #       Write-Verbose ("Enabling IC " + ($IC.Name))
        #       Enable-VMIntegrationService -Name $IC.Name -VM $NewVM
        #   } else {
        #       Write-Verbose ("Disabling IC " + ($IC.Name))
        #       Disable-VMIntegrationService -Name $IC.Name -VM $NewVM
        #   }
        #}
        # My Patch
        Write-Info " - Integration Services..."
        $ICs = Get-VMIntegrationService $SourceVM
        ForEach ($IC in $ICS) {
          switch($IC.Name){
           "時刻の同期" {
              if ($IC.Enabled) {
                Write-Verbose ("Enabling IC " + ($IC.Name))
                Enable-VMIntegrationService -Name "Time Synchronization" -VM $NewVM
              } else {
                Write-Verbose ("Disabling IC " + ($IC.Name))
                Disable-VMIntegrationService -Name "Time Synchronization" -VM $NewVM 
              }
           }
           "ハートビート" {
              if ($IC.Enabled) {
                Write-Verbose ("Enabling IC " + ($IC.Name))
                Enable-VMIntegrationService -Name "Heartbeat" -VM $NewVM
              } else {
                Write-Verbose ("Disabling IC " + ($IC.Name))
                Disable-VMIntegrationService -Name "Heartbeat" -VM $NewVM 
              }
           }
           "キー値ペア交換" {
              if ($IC.Enabled) {
                Write-Verbose ("Enabling IC " + ($IC.Name))
                Enable-VMIntegrationService -Name "Key-Value Pair Exchange" -VM $NewVM
              } else {
                Write-Verbose ("Disabling IC " + ($IC.Name))
                Disable-VMIntegrationService -Name "Key-Value Pair Exchange" -VM $NewVM 
              }
           }
           "シャットダウン" {
              if ($IC.Enabled) {
                Write-Verbose ("Enabling IC " + ($IC.Name))
                Enable-VMIntegrationService -Name "Shutdown" -VM $NewVM
              } else {
                Write-Verbose ("Disabling IC " + ($IC.Name))
                Disable-VMIntegrationService -Name "Shutdown" -VM $NewVM
              }
           }
           "ゲスト サービス インターフェイス" {
              if ($IC.Enabled) {
                Write-Verbose ("Enabling IC " + ($IC.Name))
                Enable-VMIntegrationService -Name "Guest Service Interface" -VM $NewVM
              } else {
                Write-Verbose ("Disabling IC " + ($IC.Name))
                Disable-VMIntegrationService -Name "Guest Service Interface" -VM $NewVM
              }
           }
           default {
              if ($IC.Enabled) {
                Write-Verbose ("Enabling IC " + ($IC.Name))
                Enable-VMIntegrationService -Name $IC.Name -VM $NewVM
              } else {
                Write-Verbose ("Disabling IC " + ($IC.Name))
                Disable-VMIntegrationService -Name $IC.Name -VM $NewVM
              }
            }
          }
        }
        # My Patch

------------------------------------------------------------------------------
美しさを求めるなら → http://winscript.jp/powershell/files/Convert-VMGeneration-patch.txt (by 『Windows PowerShell ポケットリファレンス』の牟田口大介さん)


0 件のコメント: