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