|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - Перенос PST файлов |
|
VBS/WSH/JS - Перенос PST файлов
|
Новый участник Сообщения: 1 |
Здравствуйте!
Помогите подправить скрипт, для переноса подключенных файлов данных Outlook (.pst). Ошибка только при работе с именами на русском языке, при отсутствии кириллицы скрипт отрабатывает без ошибок. Для определения пути, по которому лежит файл, скрипт читает значение реестра (вложение pst.png), и если в пути или имени присутствует русский язык, то выводится следующая ошибка: C:\Documents\$.0.9.;.K. Outlook\outlook.pst ERROR Error number: 52 Скрипт
'set objects On Error Resume Next Set objFSO = CreateObject("Scripting.FileSystemObject") Set objShell = WScript.CreateObject("Wscript.Shell") Set objNetwork = CreateObject("Wscript.Network") dim objNS,objOutlook, errorCounter errorCounter = 0 Call OutlookObjects strComputer = objNetwork.ComputerName 'returns computer name '''''''''' setup log files dim objTextFile, LogFolder LogFolder = "\\server\logs$\" & strComputer Call CreateLogFile 'create log file CheckLoggedOn 'checks to see if a user is logged on - exit if not logged in ****This will pick up the system account or runas account from SCCM - beware. 'setup dictionary dim pstInfo set pstInfo = createobject("scripting.Dictionary") 'setup array to store PST locations Dim pstArray() Dim counter : counter = 0 'read Outlook Data Stores For Each objFolder In objNS.Session.Folders 'all data files in outlook if not isEmpty(GetPSTPath(objFolder.storeid)) then 'filter out empty items 'wscript.echo objFolder pstPath = GetPSTPath(objFolder.storeid) 'returns the PST file path in text redim preserve pstArray(counter) pstArray(counter) = pstPath counter = counter + 1 pstInfo.add pstPath,objFolder errorDisplay ("Read Data Store") End If Next displayMsg("------- Open PST files --------") 'log all open PST files pstKeys = pstInfo.keys 'log all open psts for each key in pstKeys displayMsg(key) Next displayMsg("------- Remove Network PST --------") 'remove all open PSTs on network shares for each key in pstKeys If GetDriveType(left(key,2)) = "Network" Then 'if PST is stored on Network share.... 'wscript.echo key objNS.RemoveStore pstInfo.item(key) 'disconnect the PST - this will not delete it displayMsg("Removed " & key) errorDisplay ("Removing Store " & key) End if Next 'creating path to outlook data folder - mydocuments\outlook files 'not using special folders as this will re-direct back to the H drive. Must use a hard coded path to the C: drive. 'myDocuments = objShell.SpecialFolders("MyDocuments") 'myDocuments = "c:\documents and settings\" & objNetwork.UserName & "\ copyLocation = "c:\documents and settings\" & objNetwork.UserName & "\My Documents\Outlook Files\" 'wscript.echo copyLocation GeneratePath(copyLocation) 'create copy location if it does not exist DisplayMsg("------ Copy to: " & copyLocation & "-------") 'Quit outlook so we can move the PST Call CloseOutlook 'copy PSTs for each key in pstKeys If GetDriveType(left(key,2)) = "Network" Then 'wscript.echo "copy " & key & " to " & copyLocation fileName = objFSO.GetBaseName(key) + ".pst" 'file name only so we can compare source and destination files destinationFileName = copyLocation & fileName DisplayMsg("Copy " & key & " to " & copyLocation) objFSO.copyfile key,copyLocation 'give time for copy to complete. WARNING.....if user has large PST eg 2GB it could take several minutes to copy. errorDisplay ("Copying " & key) wscript.sleep 500 'wscript.echo ValidateCopy(key,destinationFileName) End If Next Call OutlookObjects 'add the PST files back into the store for each key in pstKeys If GetDriveType(left(key,2)) = "Network" Then 'wscript.echo ("add " & pstInfo.item(key)) fileName = objFSO.GetBaseName(key) + ".pst" destinationFileName = copyLocation & fileName 'wscript.echo "add " & destinationFileName displayMsg("Adding " & destinationFileName) objNS.AddStore destinationFileName errorDisplay ("Adding " & destinationFileName) wscript.sleep 500 End If Next objShell.run "outlook.exe" 'Mark the following for deletion in log file displayMsg("Mark the following PSTs for deletion") for each key in pstKeys If GetDriveType(left(key,2)) = "Network" Then displayMsg("DELETE-" & key) End If Next Call QuitScript 'wscript.echo "complete" ''''''''''''' FUNCTIONS AND SUBS '''''''''''''''''' Sub OutlookObjects Set objOutlook = CreateObject("Outlook.Application") Set objNS = objOutlook.GetNamespace("MAPI") wscript.sleep 3000 End Sub Sub CloseOutlook objOutlook.Session.logoff objOutlook.Quit Set objOutlook = Nothing Set objNS = Nothing WScript.Sleep 3000 'give outlook time to close KillTask("outlook.exe") 'sometimes outlook does not exit - KILL IT!!!!! End Sub Function GetPSTPath(input) For i = 1 To Len(input) Step 2 strSubString = Mid(input,i,2) If Not strSubString = "00" Then strPath = strPath & ChrW("&H" & strSubString) End If Next Select Case True Case InStr(strPath,":\") > 0 GetPSTPath = Mid(strPath,InStr(strPath,":\")-1) Case InStr(strPath,"\\") > 0 GetPSTPath = Mid(strPath,InStr(strPath,"\\")) End Select End Function Function GetDriveType(input) 'returns the type of drive the PST is stored on. strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colItems = objWMIService.ExecQuery("Select * from Win32_logicaldisk") For Each objItem In colItems If objItem.driveType = "4" And objItem.deviceID = input Then 'network drive GetDriveType = "Network" ElseIf objItem.driveType = "2" And objItem.deviceID = input Then 'removable drive GetDriveType = "Removable" ElseIf objItem.driveType = "3" And objItem.deviceID = input Then 'local disk GetDriveType = "Local Disk" End If Next End Function Function KillTask(input) 'kill outlook if it is still running. If outlook is still running, it will prevent the copy of pst. strComputer = "." strProcessToKill = input SET objWMIService = GETOBJECT("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" _ & strComputer & "\root\cimv2") SET colProcess = objWMIService.ExecQuery _ ("Select * from Win32_Process Where Name = '" & strProcessToKill & "'") count = 0 FOR EACH objProcess in colProcess objProcess.Terminate() count = count + 1 NEXT 'wscript.echo "Killed " & count & " instances of " & _ 'strProcessToKill & "on " & strComputer End Function Sub CreateLogFile 'On Error Resume Next Const ForReading = 1 Const ForWriting = 2 Const ForAppending = 8 '~~~~~~~~~~~~~~ Create Log Folder and Start Log File ~~~~~~~~~~~~~~~~~~~~~~~~~~ 'LogFolder = "\\lonlon\logs$\" & strComputer LogFile = LogFolder & "\" & "pst1.log" If objFSO.FolderExists(LogFolder) = False Then Call GeneratePath(LogFolder) End if Set objTextFile = objFSO.OpenTextFile(Logfile, ForWriting, True) 'True=create new, false=don't DisplayMsg(" - Starting Script - ") DisplayMsg(" ") DisplayMsg(" - Date: - " & Date) DisplayMsg(" - Time: - " & Time) DisplayMsg(" - Logged on User: - " & objNetwork.UserName) DisplayMsg(" ") errorDisplay ("Create Log File") End Sub Function GeneratePath(pFolderPath) GeneratePath = False If Not objFSO.FolderExists(pFolderPath) Then If GeneratePath(objFSO.GetParentFolderName(pFolderPath)) Then GeneratePath = True Call objFSO.CreateFolder(pFolderPath) End If Else GeneratePath = True End If End Function '~~~~~~~~~~~~~~ Write "DisplayMsg" variable to log file ~~~~~~~~~~~~~~ Function DisplayMsg(strMessage) If iDisplayLogFile = 1 Then WScript.Echo strMessage End If objTextFile.WriteLine strMessage End Function Function errorDisplay (desciption) If Err.Number <> 0 Then DisplayMsg(" ERROR " & description) DisplayMsg("Error number: " & err.number) DisplayMsg("Error description: " & err.description) err.clear errorCounter = errorCounter + 1 End If End Function Function GetFileSize(input) Dim File Set file = objFSO.GetFile(input) GetFileSize = file.size / 1024 End Function Function ValidateCopy(source,destination) 'need to convert this to a md5 hash operation http://www.naterice.com/articles/66 sourceFileSize = GetFileSize(source) destFileSize = GetFileSize(destination) if sourceFileSize = destFileSize Then ValidateCopy = "TRUE" displayMsg("File copy validated") Else ValidateCopy = "FALSE" displayMsg("************ WARNING - File copy operation appears to have failed") End IF End Function Function CheckLoggedOn strComputer = "." Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set colItems = objWMIService.ExecQuery("Select * From Win32_ComputerSystem") For Each objItem in colItems strUserName = objItem.UserName If IsNull(strUserName) Then displayMsg("No one logged on - Exiting Script") wscript.exit 95 Else displayMsg("User logged on - Continuing Script") End If Next End Function Sub QuitScript displayMsg("Exiting script with error code: " & errorCounter) wscript.quit errorCounter End Sub Function CheckProcess (input) set service = GetObject ("winmgmts:") 'CheckProcess = "FALSE" for each Process in Service.InstancesOf ("Win32_Process") If Process.Name = input then 'wscript.echo input & " running" CheckProcess = "TRUE" End If next End Function |
|
Отправлено: 14:31, 30-08-2017 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
V. 2007 - вопрос переноса .pst файлов на Exchange Server | shterb | Microsoft Exchange Server | 2 | 17-01-2014 13:03 | |
V. 2010 - Импорт *.pst файлов в edb базу Exchange | 2poisonS | Microsoft Exchange Server | 7 | 15-09-2012 15:06 | |
CMD/BAT - перенос файлов | Untiring | Скриптовые языки администрирования Windows | 0 | 07-08-2012 10:01 | |
CMD/BAT - перенос файлов | saha1010 | Скриптовые языки администрирования Windows | 0 | 03-12-2011 15:34 | |
CMD/BAT - Бекапирование Оутлук заблокированных pst файлов (backup Outlook) почты через bat/cmd | biossa | Скриптовые языки администрирования Windows | 0 | 28-09-2011 22:02 |
|