Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Скрипт для изменения настроек Mozilla Thunderbird (prefs.js)

Ответить
Настройки темы
Любой язык - [решено] Скрипт для изменения настроек Mozilla Thunderbird (prefs.js)

Аватара для batyaPS

Ветеран


Сообщения: 968
Благодарности: 61

Профиль | Отправить PM | Цитировать


Как можно скриптом в заданной папке (с вложенными папками) найти все файлы 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);

их убрать.

Отправлено: 16:14, 10-06-2012

 

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


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

Отправлено: 16:52, 10-06-2012 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для batyaPS

Ветеран


Сообщения: 968
Благодарности: 61

Профиль | Отправить PM | Цитировать


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

Отправлено: 17:14, 10-06-2012 | #3


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Ну, тогда примерно так:
читать дальше »
Код: Выделить весь код
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», если они найдены?!
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:10, 11-06-2012 | #4


Аватара для batyaPS

Ветеран


Сообщения: 968
Благодарности: 61

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 14:26, 11-06-2012 | #5


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


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

Отправлено: 14:36, 11-06-2012 | #6


Аватара для batyaPS

Ветеран


Сообщения: 968
Благодарности: 61

Профиль | Отправить PM | Цитировать


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

Отправлено: 14:37, 11-06-2012 | #7


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


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

Отправлено: 09:14, 12-06-2012 | #8


Аватара для batyaPS

Ветеран


Сообщения: 968
Благодарности: 61

Профиль | Отправить PM | Цитировать


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

Отправлено: 12:34, 13-06-2012 | #9


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата 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
'=============================================================================
Это сообщение посчитали полезным следующие участники:

Отправлено: 00:29, 14-06-2012 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Скрипт для изменения настроек Mozilla Thunderbird (prefs.js)

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Почта - Mozilla Thunderbird [mzd] Программное обеспечение Windows 247 28-03-2022 15:40
Mozilla Thunderbird albork Автоматическая установка приложений 7 25-07-2011 16:59
Mozilla Thunderbird 2.0.0.23 OSZone Software Новости программного обеспечения 0 15-11-2009 19:30
Интернет - [addon]Mozilla ThunderBird 2.0.0.14 spellozz Наборы обновлений для Windows XP/2003/Windows 7 3 05-05-2008 13:56
gmail и Mozilla Thunderbird Kenwood Хочу все знать 4 04-01-2008 14:22




 
Переход