WindowsXPからWindows7への大量展開(バッチ編)

前回(WindowsXPからWindows7への大量展開 | 徒労日記)の「工程の詳細」>6.の続きです。VBScriptで展開後のPCを設定する方法 | 徒労日記の続きでもあるので、そちらもご覧下さい。

IPアドレスを変更する

前回からちょっと変更しました。

'
'	ネットワーク設定
'
Dim strThisPC
Dim objWMIService,objNetAdapter,colNetAdapters
Dim strIPAddress,strSubnetMask,strGateway,strDNSServers
Dim strGatewayMetric
Dim errEnable,errGateways,errDNSServer

strThisPC = "."
Set objWMIService = GetObject("winmgmts:\\" & strThisPC & "\root\cimv2")

Set colNetAdapters = objWMIService.ExecQuery _
    ("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")

strIPAddress = Array(InputBox("端末IPアドレスを入力してください","IPアドレスを入力してください","192.168.1."))
strSubnetMask = Array("255.255.255.0")
strGateway = Array("192.168.1.254")
strDNSServers = Array("192.168.1.253")

'Inform user
'WSH.Popup "設定を有効にするため、しばらくお待ちください。" & vbLf & "これには10秒ほどかかるコトもあります。",3,,64 + 5
WScript.Echo "設定を有効にするため、「OK」を押してお待ちください。" & vbLf & "その後「IPアドレスは変更されました。」と出る事を確認してください。"
strGatewayMetric = Array(1)

WScript.Sleep(500)

For Each objNetAdapter in colNetAdapters
    errEnable = objNetAdapter.EnableStatic(strIPAddress, strSubnetMask)
    errGateways = objNetAdapter.SetGateways(strGateway, strGatewaymetric)
    errDNSServer = objNetAdapter.SetDNSServerSearchOrder(strDNSServers)
    If errEnable = 0 Then
        WScript.Echo "IPアドレスは変更されました。"
    Else
        WScript.Echo "IPアドレスを変更することができませでした。" & vbCrLf & vbCrLf &_
         "LANケーブルが接続されているか確認し、手動で設定を変更してください。"
    End If
Next

WScript.Sleep(1000)

'
'	変更IPアドレス確認
'

Dim objShell,objExec,strLine,iColon,dispIP

Set objShell = WScript.CreateObject("WScript.Shell")
Set objExec = objShell.Exec("ipconfig.exe")

Do Until objExec.StdOut.AtEndOfStream
   strLine = objExec.StdOut.ReadLine
   If InStr(strLine, "IPv4") <> 0 Then
     iColon = Instr(strLine, ":")
     dispIP = Mid(strLine, iColon + 2)
   End If
Loop

WScript.Echo "正しく設定された事を確認してください" & vbCrLf & "IP Address : " & dispIP

確認は必要なので設定後にipconfigコマンドの実行結果を表示し、オペレータに確認させます。WScript.Sleep(500)/(1000)はあまり短くすると最後のipconfigで値を正常に取得できない(実際は変わってるのに)事があり。注意点としてはリンクアップしていないと動かない事。イメージはDHCP状態で配布するのが良いでしょう。
今回Windows7上で使用。

XPの特殊フォルダコピー

Option Explicit

'
'	変数定義と準備
'

Dim objShell
Dim DesktopFld,MydocumentFld,FavoriteFld '各保存対象フォルダ
Dim cpCmd 'コマンドライン
Dim Ans
Dim DriveLatter

DriveLatter = InputBox("割り当てたネットワークドライブのドライブレターを入力してください。","ネットワークドライブレター入力","Z:")
WScript.Echo "ドライブレターは " & DriveLatter & " です"

Set objShell = WScript.CreateObject("WScript.Shell")

Ans = MsgBox ("MyDocument,Desktop,Favoriteのバックアップを行います。" & vbLf & "■□■バックアップ完了■□■が出るまでお待ちください", vbOKCancel, "バックアップ確認")

Select Case Ans
    Case vbCancel
	WScript.Quit 10
End Select

'
'	Step1.旧PCデスクトップのバックアップ
'

DesktopFld = objShell.SpecialFolders("Desktop")

WScript.Echo "デスクトップフォルダは " & DesktopFld & " です"
cpCmd = "xcopy """ & DesktopFld & """ " & DriveLatter & "\backup\Desktop\ /k /e /c /h /v /f /y >> " & DriveLatter & "\log\deskback.log  2>&1"

objShell.Run "cmd /c" & cpCmd,1,true

'
'	Step2.旧PCマイドキュメントのバックアップ
'

MydocumentFld = objShell.SpecialFolders("MyDocuments")

WScript.Echo "マイドキュメントは " & MydocumentFld & " です"
cpCmd = "xcopy """ & MydocumentFld & """ " & DriveLatter & "\backup\MyDocument\ /k /e /c /h /v /f /y >> " & DriveLatter & "\log\mydcback.log  2>&1"

objShell.Run "cmd /c" & cpCmd,1,true

'
'	Step3.旧PCInternetExplorerお気に入りのバックアップ
'

FavoriteFld = objShell.SpecialFolders("Favorites")

'WScript.Echo "お気に入りは " & FavoriteFld & " です"
cpCmd = "xcopy """ & FavoriteFld & """ " & DriveLatter & "\backup\favorite\ /k /e /c /h /v /f /y >> " & DriveLatter & "\log\favoback.log  2>&1"

objShell.Run "cmd /c" & cpCmd,1,true

'
'	Step5. checkbat.の起動
'
cpCmd = DriveLatter & "\backupcheck.bat "& DriveLatter
objShell.Run "cmd /K" & cpCmd,1,true

Win7 PCに移行用フォルダを作り共有。WinXP PCでその共有にドライブを割り当てた後実行します。

やっている事はDOSのXcopyですが、MyDocumnet、デスクトップ、お気に入りの特殊フォルダをVBScriptsの”objShell.SpecialFolders”を使って取り出します。コマンドラインの特殊パスでも取れる様ですが、カスタマイズされていた場合対応できない為コチラの方法を選択。
特殊フォルダのパスは半角スペースを含む場合もあるため”””で囲む必要あり。
例 ””” & FavoriteFld & “”” → “c:\Users\xxxxx\Favorites”
Xcopyのパラメータは”/k /e /c /h /v /f /y”。それに”>> \log\xxxxback.log 2>&1″を付加してコピー時の各ログを取るように設定。その後チェック用のバッチ(backupcheck.bat)を呼び出して.logの中身を確認します。

バックアップチェック用バッチ(backupcheck.bat)

コピーが失敗する実例を受けて急いで追加したバッチ。

@ECHO OFF

IF "%1"=="" GOTO HDD_ERROR

FIND "エラー" %1\log\deskback.log %1\log\mydcback.log %1\log\favoback.log >> %1\log\resback.txt

IF ERRORLEVEL 1 GOTO NEXT
IF ERRORLEVEL 0 GOTO disp

:disp
type resback.txt
ECHO コピーできなかったファイルがあります。
ECHO (原因:コピー時のエラー)
ECHO エラーとなったコピー元ファイルを手動でコピーしてください。
ECHO 不可の場合はエスカレーションおよびチェックシートに記録して下さい。

:NEXT

FIND "アクセスが" %1\log\deskback.log %1\log\mydcback.log %1\log\favoback.log >> %1\log\resback2.txt

IF ERRORLEVEL 1 GOTO NEXT2
IF ERRORLEVEL 0 GOTO disp2

:disp2
type resback2.txt
ECHO コピーできなかったファイルがあります。
ECHO (原因:アクセス不可)
ECHO エラーとなったコピー元ファイルを手動でコピーしてください。
ECHO 不可の場合はエスカレーションおよびチェックシートに記録して下さい。

:NEXT2

ECHO ■□■バックアップ完了■□■

FIND "コピーしました" %1\log\deskback.log %1\log\mydcback.log %1\log\favoback.log

GOTO END

:HDD_ERROR

ECHO ###実行エラー###
ECHO ドライブレターが指定されていません。

GOTO END

:END

“エラー”、”アクセスが”の二つのキーワードがコピー結果に無いかFINDで検索しているだけ。有る場合はエラー行を表示し、オペレーターにxxxxback.logの調査を促します。grepでもあればいいけど取り急ぎなのでFINDコマンドで代用しました。

Win7への特殊フォルダ書き戻し

Option Explicit

'
'	変数定義と準備
'

Dim objShell
Dim DesktopFld,MydocumentFld,FavoriteFld '各保存対象フォルダ
Dim cpCmd 'コマンドライン
Dim Ans

Set objShell = WScript.CreateObject("WScript.Shell")

Ans = MsgBox ("MyDocument,Desktop,Favoriteのリストアを行います" & vbLf & "■□■リストア結果■□■が出るまでお待ちください", vbOKCancel, "リストア確認")

Select Case Ans
    Case vbCancel
	WScript.Quit 10
End Select

'
'	Step1.新PCデスクトップの復元
'

DesktopFld = objShell.SpecialFolders("Desktop")

WScript.Echo "デスクトップフォルダは " & DesktopFld & " です"
cpCmd = "robocopy C:\yyyy\Desktop """ & DesktopFld & """ /E /XF *.lnk >> C:\yyyy\log\deskrest.log  2>&1"
WScript.Echo cpCmd & " を実行します"

objShell.Run "cmd /c" & cpCmd,1,true

MsgBox  "Step1.新PCデスクトップの復元完了" , vbOKOnly , "コピーが完了しました"

'
'	Step2.新PCマイドキュメントの復元
'

MydocumentFld = objShell.SpecialFolders("MyDocuments")

WScript.Echo "マイドキュメントは " & MydocumentFld & " です"
cpCmd = "xcopy C:\yyyy\MyDocument """ & MydocumentFld & """ /k /e /c /h /v /f /y >> C:\yyyy\log\mydcrest.log  2>&1"
WScript.Echo cpCmd & " を実行します"

objShell.Run "cmd /c" & cpCmd,1,true

MsgBox  "Step2.新PCマイドキュメントの復元完了" , vbOKOnly , "コピーが完了しました"

'
'	Step3.新PCInternetExplorerお気に入りの復元
'

FavoriteFld = objShell.SpecialFolders("Favorites")

WScript.Echo "お気に入りは " & FavoriteFld & " です"
cpCmd = "xcopy C:\yyyy\favorite """ & FavoriteFld & """ /k /e /c /h /v /f /y >> C:\yyyy\log\favorest.log  2>&1"
WScript.Echo cpCmd & " を実行します"

objShell.Run "cmd /c" & cpCmd,1,true

MsgBox  "Step3.新PCInternetExplorerお気に入りの復元完了" , vbOKOnly , "コピーが完了しました"

'
'	Step4.ショートカットの選別コピー
'

objShell.Run "xcopy C:\yyyy\Desktop\*.lnk C:\yyyy\shortcut\ /S /H /C /Y /R"
objShell.Run "explorer C:\yyyy\shortcut"

'
'	Step5. checkbat.の起動
'

objShell.Run "cmd /K c:\yyyy\restorecheck.bat",1,true

基本的にWinXPの時のコピーの逆をしているだけ。デバッグ用にステップごとの表示が増えています。Win7 PCで行う為、コピー元がc:\yyyyとなっている事に注意(yyyyは移行用フォルダ名)
依頼元の希望により、移行元PCにあるアプリのショートカットを移行先PCにコピーしていません。XcopyではなくRobocopyにて.lnkを省いていません。最後に.lnkだけを集めて表示し、オペレーターの目視により選別。

このスクリプトには問題があります
・マイピクチャ、ミュージック、ビデオがコピーされない
Win7になり、それぞれがMyDocumentの上位フォルダに移動した事が原因。別途コピーする必要がある。

・「マイドキュメント」が「Document」に書き換えられる
エクスプローラで確認。ただしならない事もあり条件不明。少なくともエクスプローラのD&Dでコピーすれば発生しないのだけど、全部手動ってのもどうかと思って処置無し。

リストアチェック用バッチ(restorecheck.bat)

@ECHO OFF

FIND "エラー" c:\yyyy\log\deskrest.log c:\yyyy\log\mydcrest.log c:\yyyy\log\favorest.log >> c:\yyyy\log\resrest.txt

IF ERRORLEVEL 1 GOTO NEXT
IF ERRORLEVEL 0 GOTO disp

:disp
type resrest.txt
ECHO コピーできなかったファイルがあります。
ECHO (原因:コピー時のエラー)
ECHO エラーとなったコピー元ファイルを手動でコピーしてください。
ECHO 不可の場合はエスカレーションおよびチェックシートに記録して下さい。

:NEXT

FIND "アクセスが" c:\yyyy\log\deskrest.log c:\yyyy\log\mydcrest.log c:\yyyy\log\favorest.log >> c:\yyyy\log\resrest2.txt

IF ERRORLEVEL 1 GOTO NEXT2
IF ERRORLEVEL 0 GOTO disp2

:disp2
type resrest2.txt
ECHO コピーできなかったファイルがあります。
ECHO (原因:アクセス不可)
ECHO エラーとなったコピー元ファイルを手動でコピーしてください。
ECHO 不可の場合はエスカレーションおよびチェックシートに記録して下さい。

:NEXT2

ECHO ■□■バックアップ結果■□■

FIND "コピーしました" c:\yyyy\log\deskback.log c:\yyyy\log\mydcback.log c:\yyyy\log\favoback.log

ECHO.

ECHO ■□■リストア結果■□■
ECHO (デスクトップは目視で確認をお願いします)

FIND "コピーしました" c:\yyyy\log\mydcrest.log c:\yyyy\log\favorest.log

:END

 同じくセット品。
コピー時の結果とリストア時の結果を表示して差異を目視します。OSの違いからか完全には=にならないため、目視するしかないかなと。

 以上、あまり手の込んだ事はしていませんがそれなりに役に立ちました。

コメントを残す