前回(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の違いからか完全には=にならないため、目視するしかないかなと。
以上、あまり手の込んだ事はしていませんがそれなりに役に立ちました。