PDA

Показать полную графическую версию : [решено] Скрипт для изменения настроек Mozilla Thunderbird (prefs.js)


batyaPS
10-06-2012, 16:14
Как можно скриптом в заданной папке (с вложенными папками) найти все файлы 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);

их убрать.

Iska
10-06-2012, 16:52
batyaPS, почему в заданной, почему не в папке профилей?

batyaPS
10-06-2012, 17:14
у меня есть папка с профилями пользователей, я в ней сам хочу запускать когда нужно скрипт

Iska
11-06-2012, 11:10
Ну, тогда примерно так:
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», если они найдены?!

batyaPS
11-06-2012, 14:26
Iska, как правильно указать в скрипте путь к папке с папками профилей ?

И мне не очень понятен подход с удалением параметров… Почему бы, вместо удаления, не установить их значения в «false», если они найдены?! »
я просто изменял настройки и мониторил файл на изменения, и именно параметры удалялись из файла и записывались, значения правда или ложь не использовались, хотя возможно так тоже должно работать.

Iska
11-06-2012, 14:36
cscript.exe //nologo "<Путь к скрипту>" "<Путь к папке, откуда начнётся рекурсивный поиск файлов 'prefs.js'>"
Например:
cscript.exe //nologo "c:\Temp\My Script.vbs" "C:\Documents and Settings\User\Application Data\Thunderbird\Profiles"

batyaPS
11-06-2012, 14:37
можно добавить добавление\изменения строки:
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

Iska
12-06-2012, 09:14
что то с кавычками не так
пробовал так… »
Совсем не так. Запустите командную строку, в ней наберите описанное здесь (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);
? »
Кстати, будем пробовать скрипт без удаления, только с добавлением/изменением значений?

batyaPS
13-06-2012, 12:34
блин, не учел момент
файл 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 не трогать.
Кстати, будем пробовать скрипт без удаления, только с добавлением/изменением значений? »
давай попробуем

Iska
14-06-2012, 00:29
можно ли изменить рекурсию до одной папки? »
Можно.
Кстати, будем пробовать скрипт без удаления, только с добавлением/изменением значений? »давай попробуем »
Скрипт упростился, пробуем:
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
14-06-2012, 15:19
отлично.всё работает.спасибо.

Iska
14-06-2012, 16:06
batyaPS, ну и славненько.

Спасибо за проверку, теперь будет уверенность насчёт применимости не удаления параметров, но и простой смены значений параметров настроек Thunderbird в «prefs.js».




© OSzone.net 2001-2012