#vbscript #outlook #copying #gpo
#vbscript #outlook #копирование #объект групповой политики
Вопрос:
У меня есть этот код, который копирует PST-файлы outlook, и при использовании полного пути к файлу location он работает отлично. Я добавил метод для запуска %UserProfile% в первой строке, поскольку это необходимо запускать в контексте домена из объекта групповой политики, а выполнение этого по отдельности невозможно. Это запускает и закрывает outlook и повторно открывает его в соответствующее время, за исключением одной вещи, которая не в порядке.
Больше не копируются соответствующие файлы. Я повторил начальные %userprofile%
разделы, и они правильно считываются как "drive letter"usersuserprofile
. Я не уверен, где это происходит и как это определить.
'===================BEGIN MODIFY====================================
Set objShell = CreateObject("WScript.Shell")
userProfilePath = objShell.ExpandEnvironmentStrings("%UserProfile%")
'Set the amount of pst-files you want to copy. Start counting at 0!
ReDim pst(1)
'Define the location of each pst-file to backup. Increase the counter!
pst(0) = "%UserProfile%AppDataLocalMicrosoftOutlookPSTOutlook Data File - mike.pst"
pst(1) = "%UserProfile%AppDataLocalMicrosoftOutlookPSTArchive.pst"
'Define your backup location
BackupPath = "%UserProfile%DocumentsOutlook Backups"
'Keep old backups? TRUE/FALSE
KeepHistory = FALSE
'Maximum time in milliseconds for Outlook to close on its own
delay = 30000 'It is not recommended to set this below 8000
'Start Outlook again afterwards? TRUE/FALSE
start = TRUE
'===================STOP MODIFY====================================
'Close Outlook
Call CloseOutlook(delay)
'Outlook is closed, so we can start the backup
Call BackupPST(pst, BackupPath, KeepHistory)
'Open Outlook again when desired.
If start = TRUE Then
Call OpenOutlook()
End If
Sub CloseOutlook(delay)
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
amp; "{impersonationLevel=impersonate}!\" amp; strComputer amp; "rootcimv2")
'If Outlook is running, let it quit on its own.
For Each Process in objWMIService.InstancesOf("Win32_Process")
If StrComp(Process.Name,"OUTLOOK.EXE",vbTextCompare) = 0 Then
Set objOutlook = CreateObject("Outlook.Application")
objOutlook.Quit
WScript.Sleep delay
Exit For
End If
Next
'Make sure Outlook is closed and otherwise force it.
Set colProcessList = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = 'Outlook.exe'")
For Each objProcess in colProcessList
objProcess.Terminate()
Next
Set objWMIService = Nothing
Set objOutlook = Nothing
set colProcessList = Nothing
End Sub
Sub BackupPST(pst, BackupPath, KeepHistory)
Set fso = CreateObject("Scripting.FileSystemObject")
If KeepHistory = True Then
ArchiveFolder = Year(Now) amp; "-" amp; Month(Now) amp; "-" amp; Day(Now)
BackupPath = BackupPath amp; ArchiveFolder amp; ""
End If
For Each pstPath in pst
If fso.FileExists(pstPath) Then
fso.CopyFile pstPath, BackupPath, True
End If
Next
Set fso = Nothing
End Sub
Sub OpenOutlook()
Set objShell = CreateObject("WScript.Shell")
objShell.Run "Outlook.exe"
End Sub
Ответ №1:
При объявлении userProfilePath = objShell.ExpandEnvironmentStrings("%UserProfile%")
вы указываете путь к %UserProfile% в переменной с именем userProfilePath
, но впоследствии вы не используете эту переменную. Это проблема, потому что несколькими строками ниже вы в конечном итоге объявляете pst(#)
with %userprofile%
в виде строки, что не работает.
Другими словами, путь / строка окружения %UserProfile% должны быть расширены перед использованием в качестве пути.
Ваш код работал бы, если бы вы использовали userProfilePath
переменную, которую вы объявили:
'Define the location of each pst-file to backup. Increase the counter!
pst(0) = userProfilePath "AppDataLocalMicrosoftOutlookPSTOutlook Data File - mike.pst"
pst(1) = userProfilePath "AppDataLocalMicrosoftOutlookPSTArchive.pst"
'Define your backup location
BackupPath = userProfilePath"DocumentsOutlook Backups"
вместо
'Define the location of each pst-file to backup. Increase the counter!
pst(0) = "%UserProfile%AppDataLocalMicrosoftOutlookPSTOutlook Data File - mike.pst"
pst(1) = "%UserProfile%AppDataLocalMicrosoftOutlookPSTArchive.pst"
'Define your backup location
BackupPath = "%UserProfile%DocumentsOutlook Backups"
Комментарии:
1. Большое вам спасибо. Очевидно, что %Userprofile% работал в контексте, который знал, что это drive users userprofile есть ли причина, по которой один работает лучше другого? Кроме того, отсутствует » » в конце папки резервной копии. Это не позволит мне отметить ваш ответ, поскольку у меня низкая репутация, но это ответ!!!! Спасибо!!
2. %UserProfile% не интерпретируется вне интерпретатора командной строки (cmd.exe ). В программах, отличных от командных оболочек, вы должны получить значение переменной окружения (как вы это сделали), а затем использовать его для замены переменной оболочки.