Показать полную графическую версию : [решено] Скрипт для изменения настроек Mozilla Thunderbird (prefs.js)
Как можно скриптом в заданной папке (с вложенными папками) найти все файлы prefs.js и изменить в них две строки:
user_pref("mail.server.server2.leave_on_server", true);
user_pref("mail.server.server2.num_days_to_leave_on_server", 14);
если строки отсутствуют добавить.
если присутствуют строки:
user_pref("mail.server.server2.delete_by_age_from_server", true);
user_pref("mail.server.server2.delete_mail_left_on_server", true);
их убрать.
batyaPS, почему в заданной, почему не в папке профилей?
у меня есть папка с профилями пользователей, я в ней сам хочу запускать когда нужно скрипт
Ну, тогда примерно так:
Option Explicit
Const strFileName4Find = "prefs.js"
Dim objFSO
Dim strPath2Scan
If WScript.Arguments.Count <> 1 Then
WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptFullName & """ <Path to scan for 'prefs.js' file>"
WScript.Quit 1
End If
strPath2Scan = WScript.Arguments.Item(0)
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
If Not objFSO.FolderExists(strPath2Scan) Then
WScript.Echo "Folder [" & strPath2Scan & "] not found"
WScript.Quit 2
End If
ScanInSubFolders objFSO.GetFolder(strPath2Scan), strFileName4Find
Set objFSO = Nothing
WScript.Quit 0
'=============================================================================
'=============================================================================
' Based on: Серый форум / VBScript: поиск файла
' (url=http://forum.script-coding.com/viewtopic.php?id=2015)
'=============================================================================
Sub ScanInSubFolders(objFolder, strFileName)
Dim objSubFolder
Dim strFullFileName
'WScript.Echo "Scan folder [" & objFolder.Path & "]"
strFullFileName = objFSO.BuildPath(objFolder, strFileName)
If objFSO.FileExists(strFullFileName) Then
WScript.Echo "Found file [" & strFileName & "] in folder [" & objFolder.Path & "]"
TryFindAndReplace objFSO.GetFile(strFullFileName)
WScript.Echo
End If
On Error Resume Next
For Each objSubFolder In objFolder.SubFolders
If Err.Number = 0 Then
On Error Goto 0
ScanInSubFolders objSubFolder, strFileName
Else
Err.Clear
On Error Goto 0
WScript.Echo "Can't enumerate subfolders for folder [" & objFolder.Path & "]"
End If
Next
End Sub
'=============================================================================
'=============================================================================
Sub TryFindAndReplace(objFile)
Dim strContent
Dim strTempFileName
With objFile.OpenAsTextStream()
strContent = .ReadAll()
.Close
End With
With WScript.CreateObject("VBScript.RegExp")
'---------------------------------------------------------------------------
.Pattern = "(\s*user_pref\(""mail\.server\.server2\.leave_on_server"",\s*)(true|false)(\s*\);\s*)"
If .Test(strContent) Then
strContent = .Replace(strContent, "$1true$3")
WScript.Echo " Set value of parameter [mail.server.server2.leave_on_server] to [true]"
Else
strContent = strContent & "user_pref(""mail.server.server2.leave_on_server"", true);" & vbCrLf
WScript.Echo " Add parameter [mail.server.server2.leave_on_server] and set value to [true]"
End If
'---------------------------------------------------------------------------
'---------------------------------------------------------------------------
.Pattern = "(\s*user_pref\(""mail.server.server2.num_days_to_leave_on_server"",\s*)(\d*)(\s*\);\s*)"
If .Test(strContent) Then
strContent = .Replace(strContent, "$114$3")
WScript.Echo " Set value of parameter [mail.server.server2.num_days_to_leave_on_server] to [14]"
Else
strContent = strContent & "user_pref(""mail.server.server2.num_days_to_leave_on_server"", 14);" & vbCrLf
WScript.Echo " Add parameter [mail.server.server2.num_days_to_leave_on_server] and set value to [14]"
End If
'---------------------------------------------------------------------------
'---------------------------------------------------------------------------
.Pattern = "\s*user_pref\(""mail.server.server2.delete_by_age_from_server"",\s*true\s*\);\s*"
If .Test(strContent) Then
strContent = .Replace(strContent, "")
WScript.Echo " Delete parameter [mail.server.server2.delete_by_age_from_server]"
End If
'---------------------------------------------------------------------------
'---------------------------------------------------------------------------
.Pattern = "\s*user_pref\(""mail.server.server2.delete_mail_left_on_server"",\s*true\s*\);\s*"
If .Test(strContent) Then
strContent = .Replace(strContent, "")
WScript.Echo " Delete parameter [mail.server.server2.delete_mail_left_on_server]"
End If
'---------------------------------------------------------------------------
End With
With objFSO
strTempFileName = GetTemporaryName()
With .CreateTextFile(strTempFileName)
.Write strContent
.Close
End With
.CopyFile objFile.Path, .BuildPath(objFile.ParentFolder, .GetBaseName(objFile.Name) & ".bak"), True
.CopyFile strTempFileName, objFile.Path
.DeleteFile strTempFileName
End With
End Sub
'=============================================================================
'=============================================================================
' Серый форум / VBScript: генерация пути для временного файла или папки
' (http://forum.script-coding.com/viewtopic.php?id=1221)
'=============================================================================
Function GetTemporaryName()
Const TemporaryFolder = 2
Dim strTempName
With WScript.CreateObject("Scripting.FileSystemObject")
Do
strTempName = .BuildPath(.GetSpecialFolder(TemporaryFolder), .GetTempName)
Loop While .FileExists(strTempName) Or .FolderExists(strTempName)
End With
GetTemporaryName = strTempName
End Function
'=============================================================================
Но, в принципе, профиль может находиться в любом месте:
%AppData%\Thunderbird\profiles.ini
…
[ProfileXX]
Name=<Profile Name>
IsRelative=0
Path=<Absolute path to Profile>
…
И мне не очень понятен подход с удалением параметров… Почему бы, вместо удаления, не установить их значения в «false», если они найдены?!
Iska, как правильно указать в скрипте путь к папке с папками профилей ?
И мне не очень понятен подход с удалением параметров… Почему бы, вместо удаления, не установить их значения в «false», если они найдены?! »
я просто изменял настройки и мониторил файл на изменения, и именно параметры удалялись из файла и записывались, значения правда или ложь не использовались, хотя возможно так тоже должно работать.
cscript.exe //nologo "<Путь к скрипту>" "<Путь к папке, откуда начнётся рекурсивный поиск файлов 'prefs.js'>"
Например:
cscript.exe //nologo "c:\Temp\My Script.vbs" "C:\Documents and Settings\User\Application Data\Thunderbird\Profiles"
можно добавить добавление\изменения строки:
user_pref("mail.server.server2.check_time", 5);
и удаление (возможно прокатит изменение значения на false) строки
user_pref("mail.server.server2.login_at_startup", true);
?
что то с кавычками не так
пробовал так
If WScript.Arguments.Count <> 1 Then
WScript.Echo Usage: cscript.exe //nologo F:\BACKUP\prefs_js.vbs F:\BACKUP\MAIL
WScript.Quit 1
End If
или так
If WScript.Arguments.Count <> 1 Then
WScript.Echo "Usage: cscript.exe //nologo F:\BACKUP\prefs_js.vbs F:\BACKUP\MAIL
WScript.Quit 1
End If
и так
If WScript.Arguments.Count <> 1 Then
WScript.Echo Usage: cscript.exe //nologo "F:\BACKUP\prefs_js.vbs" "F:\BACKUP\MAIL"
WScript.Quit 1
End If
синтаксическая ошибка в строке 10
что то с кавычками не так
пробовал так… »
Совсем не так. Запустите командную строку, в ней наберите описанное здесь (http://forum.oszone.net/post-1932301.html#post1932301), наподобие:
cscript.exe //nologo "F:\BACKUP\prefs_js.vbs" "F:\BACKUP\MAIL"
P.S. Так совпало, что я Вашей последующей пятиминутной правки не увидел, а только:
можно добавить добавление\изменения строки:
user_pref("mail.server.server2.check_time", 5);
и удаление (возможно прокатит изменение значения на false) строки
user_pref("mail.server.server2.login_at_startup", true);
? »
Кстати, будем пробовать скрипт без удаления, только с добавлением/изменением значений?
блин, не учел момент
файл prefs.js так же используется в настройках расширений
пример F:\BACKUP\MAIL\popow_sn\extensions\имя расширения\prefs.js
можно ли изменить рекурсию до одной папки?
т.е. структура такая
папка с профилями
----- профиль 1
---------- prefs.js
----- профиль 2
---------- prefs.js
----- профиль ....
---------- prefs.js
----- профиль 60
---------- prefs.js
скрипт
что бы не трогать prefs.js расположенный глубже корневой папки профиля
что бы extensions\имя расширения\prefs.js не трогать.
Кстати, будем пробовать скрипт без удаления, только с добавлением/изменением значений? »
давай попробуем
можно ли изменить рекурсию до одной папки? »
Можно.
Кстати, будем пробовать скрипт без удаления, только с добавлением/изменением значений? »давай попробуем »
Скрипт упростился, пробуем:
Option Explicit
Const strFileName4Find = "prefs.js"
Dim objFSO
Dim objFolder
Dim strPath2Scan
Dim strFullFileName
If WScript.Arguments.Count <> 1 Then
WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptFullName & """ <Path to scan for 'prefs.js' file>"
WScript.Quit 1
End If
strPath2Scan = WScript.Arguments.Item(0)
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
If Not objFSO.FolderExists(strPath2Scan) Then
WScript.Echo "Folder [" & strPath2Scan & "] not found"
WScript.Quit 2
End If
For Each objFolder In objFSO.GetFolder(strPath2Scan).SubFolders
strFullFileName = objFSO.BuildPath(objFolder, strFileName4Find)
If objFSO.FileExists(strFullFileName) Then
WScript.Echo "Found file [" & strFileName4Find & "] in folder [" & objFolder.Path & "]"
TryFindAndReplace objFSO.GetFile(strFullFileName)
WScript.Echo
End If
Next
Set objFSO = Nothing
WScript.Quit 0
'=============================================================================
'=============================================================================
Sub TryFindAndReplace(objFile)
Dim objDictionary
Dim strContent
Dim strKey
Dim strTempFileName
Set objDictionary = WScript.CreateObject("Scripting.Dictionary")
objDictionary.Add "mail.server.server2.leave_on_server", Array("true|false", "true")
objDictionary.Add "mail.server.server2.num_days_to_leave_on_server", Array("\d*", "14")
objDictionary.Add "mail.server.server2.delete_by_age_from_server", Array("true|false", "false")
objDictionary.Add "mail.server.server2.delete_mail_left_on_server", Array("true|false", "false")
objDictionary.Add "mail.server.server2.check_time", Array("\d*", "5")
objDictionary.Add "mail.server.server2.login_at_startup", Array("true|false", "false")
With objFile.OpenAsTextStream()
strContent = .ReadAll()
.Close
End With
With WScript.CreateObject("VBScript.RegExp")
For Each strKey In objDictionary.Keys
.Pattern = "(\s*user_pref\(""" & Replace(strKey, ".", "\.") & """,\s*)(" & objDictionary.Item(strKey)(0) & ")(\s*\);\s*)"
If .Test(strContent) Then
strContent = .Replace(strContent, "$1" & objDictionary.Item(strKey)(1) & "$3")
WScript.Echo " Set value of parameter [" & strKey & "] to [" & objDictionary.Item(strKey)(1) & "]"
Else
strContent = strContent & "user_pref(""" & strKey & """, " & objDictionary.Item(strKey)(1) & ");" & vbCrLf
WScript.Echo " Add parameter [" & strKey & "] and set value to [" & objDictionary.Item(strKey)(1) & "]"
End If
Next
End With
objDictionary.RemoveAll
Set objDictionary = Nothing
With objFSO
strTempFileName = GetTemporaryName()
With .CreateTextFile(strTempFileName)
.Write strContent
.Close
End With
.CopyFile objFile.Path, .BuildPath(objFile.ParentFolder, .GetBaseName(objFile.Name) & ".bak"), True
.CopyFile strTempFileName, objFile.Path
.DeleteFile strTempFileName
End With
End Sub
'=============================================================================
'=============================================================================
' Серый форум / vbscript: генерация пути для временного файла или папки
' (http://forum.script-coding.com/viewtopic.php?id=1221)
'=============================================================================
Function GetTemporaryName()
Const TemporaryFolder = 2
Dim strTempName
With WScript.CreateObject("Scripting.FileSystemObject")
Do
strTempName = .BuildPath(.GetSpecialFolder(TemporaryFolder), .GetTempName)
Loop While .FileExists(strTempName) Or .FolderExists(strTempName)
End With
GetTemporaryName = strTempName
End Function
'=============================================================================
отлично.всё работает.спасибо.
batyaPS, ну и славненько.
Спасибо за проверку, теперь будет уверенность насчёт применимости не удаления параметров, но и простой смены значений параметров настроек Thunderbird в «prefs.js».
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.