Автор Тема: [RegExp] Конвертация RegExp из VBScript в Autoit  (Прочитано 7185 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн 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))$"

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

Русское сообщество AutoIt

[RegExp] Конвертация RegExp из VBScript в Autoit
« Отправлен: Июль 02, 2012, 11:04:58 »

Оффлайн Sky-WaLkeR [?]

  • Продвинутый
  • ***
  • Сообщений: 332
  • Репутация: 95
  • Пол: Мужской
    • Naboko
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: [RegExp] Конвертация RegExp из VBScript в Autoit
« Ответ #1, Отправлен: Июль 02, 2012, 11:26:38 »
Не уверен, что такая адаптация будет правильной. В AutoIt есть альтернатива классам для работы с папками и файлами - функции File... и Dir... Работа с регулярками тоже сделана по-другому - вызывается не класс, а функция StringRegExp[Replace]. Почитай в справке про них.
Попробую сделать, минут через 5 выложу в этом же сообщении.
« Последнее редактирование: Июль 02, 2012, 12:23:25 от Sky-WaLkeR »

Оффлайн warezoogle3 [?]

  • Новичок
  • *
  • Сообщений: 73

  • Автор темы
  • Репутация: 1
  • Пол: Мужской
    • Награды
Re: [RegExp] Конвертация RegExp из VBScript в Autoit
« Ответ #2, Отправлен: Июль 02, 2012, 11:49:24 »
Жду с нетерпением!
Огромное спасибо Вам!
 :ok:

Русское сообщество AutoIt

Re: [RegExp] Конвертация RegExp из VBScript в Autoit
« Ответ #2 Отправлен: Июль 02, 2012, 11:49:24 »

Оффлайн Sky-WaLkeR [?]

  • Продвинутый
  • ***
  • Сообщений: 332
  • Репутация: 95
  • Пол: Мужской
    • Naboko
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: [RegExp] Конвертация RegExp из VBScript в Autoit
« Ответ #3, Отправлен: Июль 02, 2012, 12:45:05 »
Вроде получилось... Не уверен, что правильно, но работает (по крайней мере Photoshop сразу же видит новый шрифт ttf).
Не совсем строчка в строчку... Я так понял, скрипт на VBS устанавливал все шрифты из папки, в которой он находился?

Для запуска нужна отличная библиотека WinAPIEx от Yashied, есть на форуме.
Код: AutoIt [Выделить]
#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 (относительно), так что может кое-где не самые удачные конструкции...

Оффлайн warezoogle3 [?]

  • Новичок
  • *
  • Сообщений: 73

  • Автор темы
  • Репутация: 1
  • Пол: Мужской
    • Награды
Re: [RegExp] Конвертация RegExp из VBScript в Autoit
« Ответ #4, Отправлен: Июль 02, 2012, 13:36:36 »
Да,скрипт на VBS устанавливает шрифты из той директории,в котором он сам находится.
Спасибо Вам огромное,Sky-WaLkeR,за огромную помощь,но...
Устанавил библиотеку через инсталлер,взял Ваш код,вставил в SciTE,сохранил и ... запускаю и ничего не происходит!
Шрифты находятся в той же директории. Пробовал через компиляцию,exe-шник тоже ни шевелится!

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

Русское сообщество AutoIt

Re: [RegExp] Конвертация RegExp из VBScript в Autoit
« Ответ #4 Отправлен: Июль 02, 2012, 13:36:36 »

Оффлайн Sky-WaLkeR [?]

  • Продвинутый
  • ***
  • Сообщений: 332
  • Репутация: 95
  • Пол: Мужской
    • Naboko
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: [RegExp] Конвертация RegExp из VBScript в Autoit
« Ответ #5, Отправлен: Июль 02, 2012, 14:10:43 »
Странно...
Попробуй так (добавил проверку ошибок, заменил функцию копирования, добавил сообщение о установке). Так не должно блокировать... Надеюсь.
Код: AutoIt [Выделить]
#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
 


Оффлайн warezoogle3 [?]

  • Новичок
  • *
  • Сообщений: 73

  • Автор темы
  • Репутация: 1
  • Пол: Мужской
    • Награды
Re: [RegExp] Конвертация RegExp из VBScript в Autoit
« Ответ #6, Отправлен: Июль 02, 2012, 15:00:15 »
Пробовал... На Семерке опять тоже самое,на XP абсольютно никакие шрифты не появились,ни папке Fonts,ни в настройка х программ.нигде вообще...
Почему то мне кажется,что библеотека WinAPIEx не работает... :)


Добавлено: Июль 02, 2012, 15:19:53
Конечно же ВАМ ОГРОМНОЕ СПАСИБО,проделали ОГРОМНУЮ РАБОТУ!!!

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


Добавлено: Июль 02, 2012, 15:23:45
Может надо как то по другому устанавить библиотеку?
Может без инсталлера?
И если без инсталлера,то как?
 :)
« Последнее редактирование: Июль 02, 2012, 15:23:45 от warezoogle3, Причина: Объединение сообщений »

Оффлайн Sky-WaLkeR [?]

  • Продвинутый
  • ***
  • Сообщений: 332
  • Репутация: 95
  • Пол: Мужской
    • Naboko
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: [RegExp] Конвертация RegExp из VBScript в Autoit
« Ответ #7, Отправлен: Июль 02, 2012, 15:55:59 »
Да какая это огромная работа... Так, пара строк на коленке.
Очень сомневаюсь, что это вина библиотеки. Ставить можно любым способом, но инсталлером лучше. Если бы она криво втала, скрипт не запустился бы (выдал бы ошибку)
Я ее использую, чтобы узнать реальное название шрифта, там не должно быть ничего такого критичного... К тому же у меня на семерке х64 все работает... Правда, шрифты не сразу отображаются в Windows\Fonts, но Photoshop их свободно читает.
Даже не знаю как решить проблему...

Русское сообщество AutoIt

Re: [RegExp] Конвертация RegExp из VBScript в Autoit
« Ответ #7 Отправлен: Июль 02, 2012, 15:55:59 »

Оффлайн warezoogle3 [?]

  • Новичок
  • *
  • Сообщений: 73

  • Автор темы
  • Репутация: 1
  • Пол: Мужской
    • Награды
Re: [RegExp] Конвертация RegExp из VBScript в Autoit
« Ответ #8, Отправлен: Июль 02, 2012, 18:07:19 »
Интересно получается!
Как хорошо,что можно на практике учится!

Смотрите
Вот скриншот
Нажмите для отображения изображения в оригинальном размере.

Тоесть копируются не шрифты в папку Fonts,а ссылки на них
Смотрите
Нажмите для отображения изображения в оригинальном размере.
Тоесть самы шрифты остаются на месте. :)
« Последнее редактирование: Июль 02, 2012, 22:52:50 от Garrett »

Оффлайн Sky-WaLkeR [?]

  • Продвинутый
  • ***
  • Сообщений: 332
  • Репутация: 95
  • Пол: Мужской
    • Naboko
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: [RegExp] Конвертация RegExp из VBScript в Autoit
« Ответ #9, Отправлен: Июль 02, 2012, 18:28:29 »
Да, точно. Не поверите - сейчас еще раз запустил - и такая же реакция как у Вас... Очень странно, буду думать...
P.S: большие картинки лучше оборачивать в миниатюру - при добавлении\редактировании кнопка около вставки flash

Оффлайн warezoogle3 [?]

  • Новичок
  • *
  • Сообщений: 73

  • Автор темы
  • Репутация: 1
  • Пол: Мужской
    • Награды
Re: [RegExp] Конвертация RegExp из VBScript в Autoit
« Ответ #10, Отправлен: Июль 02, 2012, 19:55:44 »
Про большие картинки - спасибо за совет! :)
Вот мне интересно - а вот если просто с помощью AutoIT скопировать шрифты в папку Fonts,не получится? Регистрация в реестре не произайдет? Тоесть если скопировать через Shell-функции или Filecopy AutoIT-а не поддерживает Shell? (Именно Shell,ну может и API,чтоб необходимость регистрации в реестре и самое главное - перезагрузки системы (для меня это очень важно) не произошло).
Потому что насколько я знаю при обычном ручном drag-n-drop-e шрифтов в папку Fonts действуют именно shell-функции. Или я неправ? Тоесть может быть можно сделать эмулирование drag-n-drop-а или copy and paste-а,но только не через интерфейс,а через команды какие-нибудь?

Оффлайн Sky-WaLkeR [?]

  • Продвинутый
  • ***
  • Сообщений: 332
  • Репутация: 95
  • Пол: Мужской
    • Naboko
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: [RegExp] Конвертация RegExp из VBScript в Autoit
« Ответ #11, Отправлен: Июль 02, 2012, 20:41:05 »
У меня не получилось адаптировать работу с Shell-объектом... Попробую еще, может получиться...
Эмулировать drag'n'drop - ой сомневаюсь... А вот Copy-Paste, как худший вариант, сойдет. Но будет несолидно...

Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 3999
  • Репутация: 963
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: [RegExp] Конвертация RegExp из VBScript в Autoit
« Ответ #12, Отправлен: Июль 02, 2012, 21:12:30 »
warezoogle3
Попробуйте так (tested by only in WinXP SP2)
Код: AutoIt [Выделить]
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

« Последнее редактирование: Июль 02, 2012, 21:27:27 от Garrett »

Скорблю и помню.




Оффлайн warezoogle3 [?]

  • Новичок
  • *
  • Сообщений: 73

  • Автор темы
  • Репутация: 1
  • Пол: Мужской
    • Награды
Re: [RegExp] Конвертация RegExp из VBScript в Autoit
« Ответ #13, Отправлен: Июль 02, 2012, 23:59:55 »
Уррааааааааааааааааа!
Garrett,получилось! Работает и на XP,и на Семерке! Спасибо огромное за то,что Вы сделали! :beer: :ok:
Sky-WaLkeR,Спасибо огромное за то,что Вы сделали! :beer: :ok:

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

Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 3999
  • Репутация: 963
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: [RegExp] Конвертация RegExp из VBScript в Autoit
« Ответ #14, Отправлен: Июль 03, 2012, 00:48:36 »
warezoogle3  [?]
Цитировать
Спасибо
Рад был помочь.

На форуме принято помечать тему решенной после получения ответа на свой вопрос!
Вверху или внизу темы нажмите на ссылку такого вида:
Тема не решена

Русское сообщество AutoIt

Re: [RegExp] Конвертация RegExp из VBScript в Autoit
« Ответ #14 Отправлен: Июль 03, 2012, 00:48:36 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
4 Ответов
4263 Просмотров
Последний ответ Сентябрь 15, 2010, 14:22:36
от Heler
9 Ответов
6243 Просмотров
Последний ответ Июнь 14, 2011, 09:22:17
от Alex Bit
2 Ответов
7538 Просмотров
Последний ответ Август 29, 2011, 22:17:08
от armenxxx1
3 Ответов
2552 Просмотров
Последний ответ Сентябрь 07, 2011, 20:10:19
от rusreg79
3 Ответов
6890 Просмотров
Последний ответ Март 25, 2012, 01:22:03
от asdf8
7 Ответов
1368 Просмотров
Последний ответ Февраль 03, 2017, 21:37:06
от eralex
2 Ответов
1144 Просмотров
Последний ответ Май 13, 2017, 15:22:23
от Garrett
0 Ответов
200 Просмотров
Последний ответ Апрель 13, 2018, 10:02:50
от АндрейVirus
8 Ответов
1493 Просмотров
Последний ответ Ноябрь 23, 2018, 09:51:08
от CreatoR
4 Ответов
1137 Просмотров
Последний ответ Январь 27, 2019, 12:04:03
от mr.Gbabak