Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Скрипт для изменения настроек Mozilla Thunderbird (prefs.js) (http://forum.oszone.net/showthread.php?t=236384)

batyaPS 10-06-2012 16:14 1931791

Скрипт для изменения настроек 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);

их убрать.

Iska 10-06-2012 16:52 1931812

batyaPS, почему в заданной, почему не в папке профилей?

batyaPS 10-06-2012 17:14 1931826

у меня есть папка с профилями пользователей, я в ней сам хочу запускать когда нужно скрипт

Iska 11-06-2012 11:10 1932185

Ну, тогда примерно так:
читать дальше »
Код:

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 1932291

Iska, как правильно указать в скрипте путь к папке с папками профилей ?

Цитата:

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

я просто изменял настройки и мониторил файл на изменения, и именно параметры удалялись из файла и записывались, значения правда или ложь не использовались, хотя возможно так тоже должно работать.

Iska 11-06-2012 14:36 1932301

Код:

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 1932302

можно добавить добавление\изменения строки:
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 1932718

Цитата:

Цитата batyaPS
что то с кавычками не так
пробовал так… »

Совсем не так. Запустите командную строку, в ней наберите описанное здесь, наподобие:
Код:

cscript.exe //nologo "F:\BACKUP\prefs_js.vbs" "F:\BACKUP\MAIL"
P.S. Так совпало, что я Вашей последующей пятиминутной правки не увидел, а только:
Цитата:

Цитата batyaPS
можно добавить добавление\изменения строки:
user_pref("mail.server.server2.check_time", 5);
и удаление (возможно прокатит изменение значения на false) строки
user_pref("mail.server.server2.login_at_startup", true);
? »

Кстати, будем пробовать скрипт без удаления, только с добавлением/изменением значений?

batyaPS 13-06-2012 12:34 1933391

блин, не учел момент
файл 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
Кстати, будем пробовать скрипт без удаления, только с добавлением/изменением значений? »

давай попробуем

Iska 14-06-2012 00:29 1933789

Цитата:

Цитата batyaPS
можно ли изменить рекурсию до одной папки? »

Можно.
Цитата:

Цитата batyaPS
Цитата:

Цитата Iska
Кстати, будем пробовать скрипт без удаления, только с добавлением/изменением значений? »

давай попробуем »

Скрипт упростился, пробуем:
читать дальше »
Код:

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 1934119

отлично.всё работает.спасибо.

Iska 14-06-2012 16:06 1934162

batyaPS, ну и славненько.

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


Время: 16:31.

Время: 16:31.
© OSzone.net 2001-