最終更新:
hide_system 2017年06月18日(日) 10:09:02履歴
仮想マシンが停止していることを確認後に、
仮想マシンファイルを、別サーバにRobocopyコマンドでコピーする。
batファイルを実行することにより、ps1ファイルを呼び出して、処理を実行する。
ps1ファイル内の処理の実行結果は、batファイルでエラーレベルとして取得できるようにする。
<CopyVmFile.bat ファイル>
@echo off powershell.exe -Command "Set-ExecutionPolicy RemoteSigned; "C:\Users\Administrator\Desktop\CopyVmFile.ps1"; exit $LASTEXITCODE" echo %errorlevel% pause
<CopyVmFile.ps1 ファイル>
$myVar_CopySourceVmName= "testVM1" $myVar_CopyDestVmHostName= "vmhost1" $myVar_CopyDestVmHostIP= "192.168.20.10" $myVar_logfile= "C:\Users\Administrator\Desktop\Log\CopyVmFile.log" $myVar_CopySourceFolder= "D:\VM\" + $myVar_CopySourceVmName $myVar_CopyDestFolder= "\\" + $myVar_CopyDestVmHostIP + "\D$\VM_CopyData\" + $myVar_CopySourceVmName ################################################## #ファイルのコピーが成功した時用の関数(ここから) #<処理概要> #ps1ファイルを呼び出したBATファイルに、戻り値として0を返す用。 function myFunc_return0 { exit 0 } #ファイルのコピーが成功した時用の関数(ここまで) ################################################## ################################################## #ファイルのコピーが失敗した時用の関数(ここから) #<処理概要> #ps1ファイルを呼び出したBATファイルに、戻り値として1を返す用。 function myFunc_return1 { exit 1 } #ファイルのコピーが失敗した時用の関数(ここまで) ################################################## function Start-Executable { param( [String] $FilePath, [String[]] $ArgumentList ) $OFS = " " $process = New-Object System.Diagnostics.Process $process.StartInfo.FileName = $FilePath $process.StartInfo.Arguments = $ArgumentList $process.StartInfo.UseShellExecute = $false $process.StartInfo.RedirectStandardOutput = $true if ( $process.Start() ) { $output = $process.StandardOutput.ReadToEnd() -replace "\r\n$","" if ( $output ) { if ( $output.Contains("`r`n") ) { $output -split "`r`n" } elseif ( $output.Contains("`n") ) { $output -split "`n" } else { $output } } $process.WaitForExit() # & "$Env:SystemRoot\system32\cmd.exe" /c exit $process.ExitCode } #return $process.ExitCode $Global:ReturnCode=$process.ExitCode } #ログファイルの存在有無調査&存在しなければ作成する。 if(-not(Test-Path -path $myVar_logfile)) { New-Item -Path $myVar_logfile -ItemType file -Value $(Get-Date) -force } else { } #戻り値を0で初期化。 $Global:ReturnCode=0 $Nowtime = Get-Date -Format yyyy/MM/dd_HH:mm:ss $msg = $NowTime + " " + "▽仮想マシンのコピー処理を実施します。" Write-Host $msg Write-Output $msg | Out-File $myVar_logfile -append -encoding Default ################################################## #仮想マシンの電源状態調査(ここから) #<処理概要> #PowerShellを10秒停止後、仮想マシンの電源状態を調査し、 #電源状態がOFFでない場合、かつ、指定回数(=intCount)に達しない場合は、 #DoWhile文を抜けずに、電源状態を調査する。 # $Nowtime = Get-Date -Format yyyy/MM/dd_HH:mm:ss $msg = $NowTime + " " + "-電源状態の調査を開始します。" Write-Host $msg Write-Output $msg | Out-File $myVar_logfile -append -encoding Default $intCount=0 do { #PowerShellを10秒間停止。 start-sleep -s 10 $intCount++ #PowerShellを10秒間停止 ×1セット 待機した後の結果処理。 if ( $intCount -gt 1) { $Nowtime = Get-Date -Format yyyy/MM/dd_HH:mm:ss $msg = $NowTime + " " + "-仮想マシンの電源状態がOFFでありません。処理を中止します。" Write-Host $msg Write-Output $msg | Out-File $myVar_logfile -append -encoding Default myFunc_return1 } } while ( Get-VM -name $myVar_CopySourceVmName | Where-Object { $_.state -ne 'Off' } ) $Nowtime = Get-Date -Format yyyy/MM/dd_HH:mm:ss $msg = $NowTime + " " + "-電源状態の調査が完了しました。" Write-Host $msg Write-Output $msg | Out-File $myVar_logfile -append -encoding Default #仮想マシンの電源状態調査(ここまで) ####################################################### ####################################################### #仮想マシンファイルのコピー処理。(ここから) $Nowtime = Get-Date -Format yyyy/MM/dd_HH:mm:ss $msg = $NowTime + " " + "別仮想サーバ( " + $myVar_CopyDestVmHostName + " )上へ、仮想マシン( " + $myVar_CopySourceVmName + " )ファイルのコピーを開始します。" Write-Host $msg Write-Output $msg | Out-File $myVar_logfile -append -encoding Default #$result = robocopy.exe $myVar_CopySourceFolder $myVar_CopyDestFolder /Copy:DAT /PURGE /E /R:3 /NP $result =(Start-Executable robocopy.exe $myVar_CopySourceFolder,$myVar_CopyDestFolder,"/Copy:DAT /PURGE /E /R:3 /W:10 /NP" ) Write-Host "aaaaaaaaaaaaaaaaaa" #Write-Output $result Write-Output $Global:ReturnCode switch($Global:ReturnCode){ 16 {Write-Host "RobocopyReturnCode:" $Global:ReturnCode "( ***FATAL ERROR*** )";$Global:ReturnCode=1} 15 {Write-Host "RobocopyReturnCode:" $Global:ReturnCode "( FAIL MISM XTRA COPY)";$Global:ReturnCode=1} 14 {Write-Host "RobocopyReturnCode:" $Global:ReturnCode "( FAIL MISM XTRA )";$Global:ReturnCode=1} 13 {Write-Host "RobocopyReturnCode:" $Global:ReturnCode "( FAIL MISM COPY)";$Global:ReturnCode=1} 12 {Write-Host "RobocopyReturnCode:" $Global:ReturnCode "( FAIL MISM )";$Global:ReturnCode=1} 11 {Write-Host "RobocopyReturnCode:" $Global:ReturnCode "( FAIL XTRA COPY)";$Global:ReturnCode=1} 10 {Write-Host "RobocopyReturnCode:" $Global:ReturnCode "( FAIL XTRA )";$Global:ReturnCode=1} 9 {Write-Host "RobocopyReturnCode:" $Global:ReturnCode "( FAIL COPY)";$Global:ReturnCode=1} 8 {Write-Host "RobocopyReturnCode:" $Global:ReturnCode "( FAIL )";$Global:ReturnCode=1} 7 {Write-Host "RobocopyReturnCode:" $Global:ReturnCode "( MISM XTRA COPY)";$Global:ReturnCode=0} 6 {Write-Host "RobocopyReturnCode:" $Global:ReturnCode "( MISM XTRA )";$Global:ReturnCode=0} 5 {Write-Host "RobocopyReturnCode:" $Global:ReturnCode "( MISM COPY)";$Global:ReturnCode=0} 4 {Write-Host "RobocopyReturnCode:" $Global:ReturnCode "( MISM )";$Global:ReturnCode=0} 3 {Write-Host "RobocopyReturnCode:" $Global:ReturnCode "( XTRA COPY)";$Global:ReturnCode=0} 2 {Write-Host "RobocopyReturnCode:" $Global:ReturnCode "( XTRA )";$Global:ReturnCode=0} 1 {Write-Host "RobocopyReturnCode:" $Global:ReturnCode "( COPY)";$Global:ReturnCode=0} 0 {Write-Host "RobocopyReturnCode:" $Global:ReturnCode "( --no change-- )";$Global:ReturnCode=0} default {Write-Host "RobocopyReturnCode:" $Global:ReturnCode "( 該当エラーコード不明。)";$Global:ReturnCode=1} } Write-Host "bbbbbbbbbbbbbbbbbb" #Robocopyコマンドの結果判定処理。 if ( $Global:ReturnCode -eq 0) { $Nowtime = Get-Date -Format yyyy/MM/dd_HH:mm:ss $msg = $NowTime + " " + "別仮想サーバ( " + $myVar_CopyDestVmHostName + " )上へ、仮想マシン( " + $myVar_CopySourceVmName + " )ファイルのコピーが成功しました。" Write-Host $msg Write-Output $msg | Out-File $myVar_logfile -append -encoding Default myFunc_return0 } else { $Nowtime = Get-Date -Format yyyy/MM/dd_HH:mm:ss $msg = $NowTime + " " + "別仮想サーバ( " + $myVar_CopyDestVmHostName + " )上へ、仮想マシン( " + $myVar_CopySourceVmName + " )ファイルのコピーが失敗しました。" Write-Host $msg Write-Output $msg | Out-File $myVar_logfile -append -encoding Default myFunc_return1 } #仮想マシンファイルのコピー処理。(ここまで) #######################################################
コメントをかく