Что нового

[RegExp] Конвертация RegExp из VBScript в Autoit

warezoogle3

Новичок
Сообщения
73
Репутация
1
Здравствуйте,уважаемые!
Недавно начал учить VBScript и AutoIT! Пока в этом деле новичок.
Но по работе понадобилось использовать их.
В общем нашел один VBS скрипт,который устанавливает шрифты без перезагрузки.
Вот код VBS:
Код:
Const FONTS	= &H14&
 
Set objShell	= CreateObject("Shell.Application")
Set ofso	= CreateObject("Scripting.FileSystemObject")
 
SourceFolder	= ofso.GetParentFolderName(Wscript.ScriptFullName)
Set oSource	= objShell.Namespace(SourceFolder)
Set oWinFonts	= objShell.Namespace(FONTS)
 
Set regEx	= New RegExp
regEx.IgnoreCase = True
regEx.Pattern	= "([\w\s]+?)(_[^_]*)?(\.(ttf|otf|pfm|fon))$"
 
FOR EACH FontFile IN oSource.Items()
	fontFileName = ofso.GetFileName(FontFile.Path)
	IF regEx.Test(fontFileName) THEN
		Set objMatch = regEx.Execute(fontFileName)
		win7FontFileName = objMatch.Item(0).Submatches(0) & objMatch.Item(0).Submatches(2)
		localFontPath = oWinFonts.Self.Path & "\" & fontFileName
		win7LocalFontPath = oWinFonts.Self.Path & "\" & win7FontFileName
		IF NOT ofso.FileExists(localFontPath) AND NOT ofso.FileExists(win7LocalFontPath) THEN
			oWinFonts.CopyHere FontFile.Path
		END IF
	END IF
NEXT

Попытался конвертировать в AutoIT
Вот что получилось:
Код:
Const $FONTS = 0x14

Local $objShell	= ObjCreate("Shell.Application")
Local $ofso	= ObjCreate("Scripting.FileSystemObject")

Local $SourceFolder	= $ofso.GetParentFolderName(@ScriptFullPath)
Local $oSource	= $objShell.Namespace($SourceFolder)
Local $oWinFonts	= $objShell.Namespace($FONTS)

$regEx	= $New $RegExp
$regEx.IgnoreCase = 1
$regEx.Pattern	= "([\w\s]+?)(_[^_]*)?(\.(ttf|otf|pfm|fon))$"

For $FontFile IN $oSource.Items()
	$fontFileName = $ofso.GetFileName($FontFile.Path)
	IF $regEx.Test($fontFileName) THEN
		 $objMatch = $regEx.Execute($fontFileName)
		$win7FontFileName = $objMatch.Item(0).Submatches(0) & $objMatch.Item(0).Submatches(2)
		$localFontPath = $oWinFonts.Self.Path & "\" & $fontFileName
		$win7LocalFontPath = $oWinFonts.Self.Path & "\" & $win7FontFileName
		IF NOT $ofso.FileExists($localFontPath) AND NOT $ofso.FileExists($win7LocalFontPath) THEN
			$oWinFonts.CopyHere ($FontFile.Path)
		EndIf
	EndIf
NEXT

Но вот конвертация регулярных выражений неосилил. Пожалуйста помогите! Что я делаю не так?
Думаю,что в главная ошибка в
Код:
$regEx	= $New $RegExp
$regEx.IgnoreCase = 1
$regEx.Pattern	= "([\w\s]+?)(_[^_]*)?(\.(ttf|otf|pfm|fon))$"

Помогите пожалуйста! Заранее огромное спасибо! :smile:
 

sss

Продвинутый
Сообщения
332
Репутация
96
Не уверен, что такая адаптация будет правильной. В AutoIt есть альтернатива классам для работы с папками и файлами - функции File... и Dir... Работа с регулярками тоже сделана по-другому - вызывается не класс, а функция StringRegExp[Replace]. Почитай в справке про них.
Попробую сделать, минут через 5 выложу в этом же сообщении.
 
Автор
W

warezoogle3

Новичок
Сообщения
73
Репутация
1
Жду с нетерпением!
Огромное спасибо Вам!
:ok:
 

sss

Продвинутый
Сообщения
332
Репутация
96
Вроде получилось... Не уверен, что правильно, но работает (по крайней мере Photoshop сразу же видит новый шрифт ttf).
Не совсем строчка в строчку... Я так понял, скрипт на VBS устанавливал все шрифты из папки, в которой он находился?

Для запуска нужна отличная библиотека WinAPIEx от Yashied, есть на форуме.
Код:
#include <WinAPIEx.au3>

$key = 'HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts'
$regex_pattern	= "(.*?)\.(ttf|otf|pfm|fon)"

$search=FileFindFirstFile(@ScriptDir & '\*.*')
While 1
	$file=FileFindNextFile($search)
	if @error then ExitLoop; если файлы кончились
	$regex_ret=StringRegExp($file,$regex_pattern,1)
	if @error=0 Then
		$name=_WinAPI_GetFontResourceInfo (@ScriptDir & '\' & $file,1); название шрифта
		_WinAPI_AddFontResourceEx(@ScriptDir & '\' & $file)
		RegWrite($key, $name, 'REG_SZ', $file); заносим данные в реестр
	EndIf
WEnd

P.S: Давно уже не писал на AutoIt (относительно), так что может кое-где не самые удачные конструкции...
 
Автор
W

warezoogle3

Новичок
Сообщения
73
Репутация
1
Да,скрипт на VBS устанавливает шрифты из той директории,в котором он сам находится.
Спасибо Вам огромное,Sky-WaLkeR,за огромную помощь,но...
Устанавил библиотеку через инсталлер,взял Ваш код,вставил в SciTE,сохранил и ... запускаю и ничего не происходит!
Шрифты находятся в той же директории. Пробовал через компиляцию,exe-шник тоже ни шевелится!

5 минут спустя...
Поменял имена шрифтов с заглавных (прописных) букв на строчные.Теперь шрифты видны,можно даже использовать в темах (theme),но самое интересное то,что в папке Fonts шрифты видны в виде ссылок (shortcuts)! А шрифты,которые находятся в папке с скриптом,если их использовать например в теме (получается в теме не они сами,а их ссылки),не удаляются,локнуты (locked)! Удалил unlocker-ом! Интересная тема получается!
 

sss

Продвинутый
Сообщения
332
Репутация
96
Странно...
Попробуй так (добавил проверку ошибок, заменил функцию копирования, добавил сообщение о установке). Так не должно блокировать... Надеюсь.
Код:
#include <WinAPIEx.au3>

const $key = 'HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts'
$fonts_folder=@WindowsDir & "\Fonts" ; папка со шрифтами
$regex_pattern	= "(.*?)\.(ttf|otf|pfm|fon)"

$search=FileFindFirstFile(@ScriptDir & '\*.*')
While 1
	$file=FileFindNextFile($search)
	if @error then ExitLoop; если файлы кончились
	$regex_ret=StringRegExp($file,$regex_pattern,1)
	if @error=0 Then
		$name=_WinAPI_GetFontResourceInfo (@ScriptDir & '\' & $file,1); название шрифта
		if $name='' then ContinueLoop
		$ret=FileCopy(@ScriptDir & '\' & $file, $fonts_folder & '\' & StringLower($file))
		if $ret=0 then ContinueLoop
		RegWrite($key, $name, 'REG_SZ', StringLower($file)); заносим данные в реестр
		MsgBox(0,'','Шрифт ' & $name & ' установлен.')
	EndIf
WEnd
 
Автор
W

warezoogle3

Новичок
Сообщения
73
Репутация
1
Пробовал... На Семерке опять тоже самое,на XP абсольютно никакие шрифты не появились,ни папке Fonts,ни в настройка х программ.нигде вообще...
Почему то мне кажется,что библеотека WinAPIEx не работает... :smile:


Добавлено:
Сообщение автоматически объединено:

Конечно же ВАМ ОГРОМНОЕ СПАСИБО,проделали ОГРОМНУЮ РАБОТУ!!!

Просто вот не знаю,что делать.
Интересно,без этой библиотеки можно обойтись? :smile:


Добавлено:
Сообщение автоматически объединено:

Может надо как то по другому устанавить библиотеку?
Может без инсталлера?
И если без инсталлера,то как?
:smile:
 

sss

Продвинутый
Сообщения
332
Репутация
96
Да какая это огромная работа... Так, пара строк на коленке.
Очень сомневаюсь, что это вина библиотеки. Ставить можно любым способом, но инсталлером лучше. Если бы она криво втала, скрипт не запустился бы (выдал бы ошибку)
Я ее использую, чтобы узнать реальное название шрифта, там не должно быть ничего такого критичного... К тому же у меня на семерке х64 все работает... Правда, шрифты не сразу отображаются в Windows\Fonts, но Photoshop их свободно читает.
Даже не знаю как решить проблему...
 
Автор
W

warezoogle3

Новичок
Сообщения
73
Репутация
1
Интересно получается!
Как хорошо,что можно на практике учится!

Смотрите
Вот скриншот


Тоесть копируются не шрифты в папку Fonts,а ссылки на них
Смотрите

Тоесть самы шрифты остаются на месте. :smile:
 

sss

Продвинутый
Сообщения
332
Репутация
96
Да, точно. Не поверите - сейчас еще раз запустил - и такая же реакция как у Вас... Очень странно, буду думать...
P.S: большие картинки лучше оборачивать в миниатюру - при добавлении\редактировании кнопка около вставки flash
 
Автор
W

warezoogle3

Новичок
Сообщения
73
Репутация
1
Про большие картинки - спасибо за совет! :smile:
Вот мне интересно - а вот если просто с помощью AutoIT скопировать шрифты в папку Fonts,не получится? Регистрация в реестре не произайдет? Тоесть если скопировать через Shell-функции или Filecopy AutoIT-а не поддерживает Shell? (Именно Shell,ну может и API,чтоб необходимость регистрации в реестре и самое главное - перезагрузки системы (для меня это очень важно) не произошло).
Потому что насколько я знаю при обычном ручном drag-n-drop-e шрифтов в папку Fonts действуют именно shell-функции. Или я неправ? Тоесть может быть можно сделать эмулирование drag-n-drop-а или copy and paste-а,но только не через интерфейс,а через команды какие-нибудь?
 

sss

Продвинутый
Сообщения
332
Репутация
96
У меня не получилось адаптировать работу с Shell-объектом... Попробую еще, может получиться...
Эмулировать drag'n'drop - ой сомневаюсь... А вот Copy-Paste, как худший вариант, сойдет. Но будет несолидно...
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
warezoogle3
Попробуйте так (tested by only in WinXP SP2)
Код:
Const $FONTS   = 0x14

$oShell   = ObjCreate("Shell.Application")
$oWinFonts   = $oShell.Namespace($FONTS)

; шрифты должны быть в директории скрипта
$sFirstFile = FileFindFirstFile("*.*")

If $sFirstFile = -1 Then
    Exit
EndIf

While 1
    Local $sFile = FileFindNextFile($sFirstFile)
    If @error Then ExitLoop
	Switch StringRight($sFile, 3)
	Case 'ttf', 'otf', 'pfm', 'fon'
		$sWinFontsPath = @WindowsDir & '\Fonts\' & $sFile
		$sLocFontsPath = @ScriptDir & '\' & $sFile
		If NOT FileExists($sWinFontsPath) Then
			$oWinFonts.CopyHere($sLocFontsPath)
		Else
			MsgBox(262144, $sFile, 'Файл уже установлен', 1)
		EndIf
	EndSwitch
WEnd
 
Автор
W

warezoogle3

Новичок
Сообщения
73
Репутация
1
Уррааааааааааааааааа!
Garrett,получилось! Работает и на XP,и на Семерке! Спасибо огромное за то,что Вы сделали! :beer: :ok:
Sky-WaLkeR,Спасибо огромное за то,что Вы сделали! :beer: :ok:

Люди добрые,спасибо за энергию,время и внимание!
Пусть Бог даст вам 1000 раз больше!
:beer: :IL_AutoIt_1:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
warezoogle3 [?]
Рад был помочь.

[info border=#0000ff float=left]На форуме принято помечать тему решенной после получения ответа на свой вопрос!
Вверху или внизу темы нажмите на ссылку такого вида:
package_old.gif
Тема не решена
[/info]
 
Верх