1 (изменено: martyn-k, 2017-02-17 00:44:29)

Тема: JS: Перечислить имена системных шрифтов (VBS >> JS)

Как преобразовать из VBScript в код  JavaScript? Этот код позволяет получать список имен системных шрифтов:

const HKEY_LOCAL_MACHINE = &H80000002

strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts"

Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
 

oReg.EnumValues HKEY_LOCAL_MACHINE, strKeyPath, arrValueNames

For each strValueName in arrValueNames

	oReg.GetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue

	wscript.echo strValue & vbTab & vbTab & strValueName

Next

set oReg = Nothing

2

Re: JS: Перечислить имена системных шрифтов (VBS >> JS)

martyn-k
Ознакомьтесь с правилами оформления.
Отредактируйте заголовок и проставьте заглавные буквы.
А пока ответы запрещены.

Заголовок JS: Преобразовать код VBS в JS не годится. Нужно указывать суть ТЗ. Исправлено.
Обсуждение открыто.

InPath = 'SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts\\'
var Reg = new ActiveXObject('WbemScripting.SWbemLocator').ConnectServer(null, 'root\\default').Get('StdRegProv')
var WSS = new ActiveXObject('WScript.Shell')
var pInput = Reg.Methods_.Item('EnumValues').InParameters.SpawnInstance_()
pInput.hDefKey = 0x80000002; pInput.sSubKeyName = InPath
var pOutput = Reg.ExecMethod_('EnumValues', pInput)
var keys = pOutput.sNames.toArray()
for (i = 0; i < keys.length; i++)
  WSH.Echo(keys[i] + ' = ' + WSS.RegRead('HKLM\\' + InPath + keys[i]))

3 (изменено: martyn-k, 2017-02-19 22:15:42)

Re: JS: Перечислить имена системных шрифтов (VBS >> JS)

Flasher
БООООЛЬШУЩЕЕ СПАСИБО!
И не думал ставить ТЗ, тем более указывать, просто спросил. Спасибо.

Я запускаю скрипт из скрипта из After Effects. Именно так, потому что не нашел как добраться ко все этим непонятным ActiveX напрямую из After Effects.
Уж простите за наглость, но раз Вы так легко справились, то:
1. Будет ли это работать и под маком? Задумка такая: скрипт в After Effects генерит (сохраняет на диск) Ваш скрипт, дописывая в конце адрес папки пользователя ("мои документы"), затем запускает Ваш скрипт, Ваш скрипт сохраняет файл .txt со списком, этот список теперь можно прочитать.
2. Что это он пишет в начале списка в текстовом файле?

‘ҐаўҐа б楠ਥў Windows (Microsoft R) ўҐабЁп 5.812
Copyright (C) Љ®аЇ®а жЁп Њ ©Єа®б®дв 1996-2006, ўбҐ Їа ў  § йЁйҐл.

Я его запускал в cmd командой:

cscript.exe D:\info\ae\scripts\TEST_TEMP_SCRIPTS\fonts.js > D:\info\ae\scripts\TEST_TEMP_SCRIPTS\fonts2.txt

3. Может направите, где "на пальцах" рассказано про объекты, которые Вы использовали?

4

Re: JS: Перечислить имена системных шрифтов (VBS >> JS)

martyn-k
Суть ТЗ нужно описывать (указывать) в заголовке. В этом направлении стоило подумать.
1. Мак и реестр Windows  - вещи несовместимые.
2. На Windows скрипт запускается стандартно без указания интерпретатора. Привязан по умолчанию к WScript.exe.
В случае cscript.exe, чтобы не выводить заголовок, нужно указать параметр //Nologo. Что он в нём пишет, можно посмотреть из консоли, выполнив cmd /k cscript из Run (Win+R).
В каком окончательном виде требуется выгрузить список? И, например, в папке Fonts шрифтов больше, чем в данном списке. Можно вытянуть названия из самих файлов.
3. 1, 2, 3.

5 (изменено: martyn-k, 2017-02-19 22:14:53)

Re: JS: Перечислить имена системных шрифтов (VBS >> JS)

Flasher
Еще раз спасибо!
Похоже, что окончательный список должен быть автоматически сохранен в текстовый файл, других вариантов не вижу.
Из After Effects я могу запустить скрипт командой:

system.callSystem("cmd.exe /c \"start cscript.exe D:\\info\\ae\\scripts\\TEST_TEMP_SCRIPTS\\fonts.vbs\"");

Возвращать значение напрямую рисковано (записывать его в переменную), Афтер бывало ждал-ждал, и зависал. Поэтому остается сохранение в файл (например при первом открытии диалогового окна), окно откроется, а пока пользователь нажмет кнопку, пройдет какое-то время, текстовый файл успеет сохраниться.
Список, который генерит Ваш скрипт, и вправду неполный. Если возможно имена повытягивать из файлов, то это будет лучше, даже пусть в ущерб производительности. Сам список, это перечень имен через какой-то разделитель.
Ну и про мак: я ведь могу спросить в новой теме? Нужно и для мака что-то аналогичное.

6

Re: JS: Перечислить имена системных шрифтов (VBS >> JS)

martyn-k пишет:

Из After Effects я могу запустить скрипт командой

А wscript.exe чем не подошёл?
Если рассматривать консоль и реестр, то проще так (без указания cmd /c):

reg query HKLM\SOFTWARE\Microsoft\Windows" "NT\CurrentVersion\Fonts>AllFonts.txt
martyn-k пишет:

Афтер бывало ждал-ждал, и зависал.

И чего же он ждёт?

martyn-k пишет:

Сам список, это перечень имен через какой-то разделитель.

Надо бы поконкретней. В приведённом примере есть названия шрифтов и имена их файлов. И выше я вижу строку с vbs, хотя до этого был js. Что нужно-то в итоге?

+ Про Mac:
martyn-k пишет:

Ну и про мак: я ведь могу спросить в новой теме? Нужно и для мака что-то аналогичное.

Обратиться в этот раздел, конечно, можно, но вероятность получения ответа невелика (маковцев тут днём с огнём не сыщешь), если, конечно, Rumata что-нибудь на bash не набросает. С этим скорее сюда, сюда или сюда. Чтиво на русском: 1, 2, 3.

7 (изменено: martyn-k, 2017-02-19 22:17:03)

Re: JS: Перечислить имена системных шрифтов (VBS >> JS)

Flasher
Из After Effects генерится пустой txt-файл. Запускаю командой:

var str = system.callSystem('cmd.exe /c \"start \"reg query HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts>D:f.txt\"\"');
alert (str);

Если ошибусь в строке параметров (кавычки, бекслеши), запустится консоль cmd и After Effects зависнет, я думал, что он ждет возвращения данных. Закрытие консоли не спасает.
Без указания cmd /c After Effects зависает.
Вот фрагмент хелпа (http://blogs.adobe.com/wp-content/blogs.dir/48/files/2012/06/After-Effects-CS6-Scripting-Guide.pdf?file=2012/06/After-Effects-CS6-Scripting-Guide.pdf, стр. 180):

System callSystem() method
system.callSystem (cmdLineToExecute);
Description
Executes a system command, as if you had typed it on the operating system’s command line. Returns whatever
the system outputs in response to the command, if anything.
In Windows, you can invoke commands using the /c switch for the cmd.exe command, passing the command
to run in escaped quotes (\"...\"). For example, the following retrieves the current time and displays it to the
user:
var timeStr = system.callSystem("cmd.exe /c \"time /t\"");
alert("Current time is " + timeStr);

Итого, все запускается через cmd.exe /c.

Список шрифтов хочу поместить в dropDownList, как это можно увидеть, напр. в Ворде. Форматирование списка не важно, важно (мне) его конвертнуть в массив. Имена файлов шрифтов не нужны, нужны имена самих шрифтов.http://www.imageup.ru/img242/2687193/untitled-2.jpg

PS. Ваш скрипт выводит достаточно полный список, просто имена были чуть разбросаны.
PS. VBS я подставил, потому что пробую то одно то другое.

8

Re: JS: Перечислить имена системных шрифтов (VBS >> JS)

martyn-k
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
Исправьте всюду в двух последних опубликованных постах на форуме.

9

Re: JS: Перечислить имена системных шрифтов (VBS >> JS)

martyn-k
Почему после D: нет \\ ? Кавычка перед start и в конце обязательна?
REG имеет код возврата (0/1 = успешно/нет). В цитате я не увидил, что нужно запускать именно через cmd /c.
Нужно выяснить, какой код ждёт AE. Мы же можем использовать WSH.Quit("<код выхода>").
В каком смысле имена разбросаны? Они же по алфавиту идут.

GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")._
EnumValues &H80000002, "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts", Arr
For Each Name In Arr : S = S & vbCr & Name : Next  : WSH.Echo Mid(S, 2)

10

Re: JS: Перечислить имена системных шрифтов (VBS >> JS)

Flasher, спасибо.
Простите, со слешами, это невнимательность, я пробовал разные варианты:
Вариант 1, просто запрос:

var str = system.callSystem("reg query HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts>D:\\f.txt");
alert (str);

http://www.imageup.ru/img122/2688374/1.jpg
Вариант 2, без кавычек:

var str = system.callSystem("cmd.exe /c reg query HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts>D:\\f.txt");
alert (str);

Появляется пустой алерт. И создается пустой текстовый файл.
Вариант 3, дополнительные кавычки, это советовали на форумах по After Effects:

var str = system.callSystem('cmd.exe /c \" \"reg query HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts>D:\\f.txt\"\"');
alert (str);

http://www.imageup.ru/img122/2688392/3.jpg
Вариант 4, без /c:

var str = system.callSystem('cmd.exe reg query HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts>D:\\f.txt');
alert (str);

http://www.imageup.ru/img122/2688396/4.jpg
Вариант 5, взял в кавычки запрос:

var str = system.callSystem("cmd /c reg query \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts\">D:\\f.txt");
alert (str);

Промелькает консоль со списком:
http://www.imageup.ru/img122/2688405/5.jpg
Затем пустой алерт. Создается пустой текстовый файл. Если закрывающую кавычку (после Fonts) переношу в самый конец, появляется только пустой алерт, файл не создается.
Кратко: /с ставил в разные места, %20, одинарную кавычку, одинарный слеш - все это или не работает, или в алерте пишет про ошибку или отсутствие прав. Без cmd - пишет, что системе не удается найти указанный файл.

11

Re: JS: Перечислить имена системных шрифтов (VBS >> JS)

martyn-k
В первом варианте нужно так: ...\\Windows\" \"NT\\...

Скачал AE. Куда прописывать?

12

Re: JS: Перечислить имена системных шрифтов (VBS >> JS)

Flasher
Не сработало. "Ошибка: Не удается найти указанный раздел или параметр в реестре".
Прописывать: Меню File->Scripts->Open Script Editor. Запуск: F5.

13

Re: JS: Перечислить имена системных шрифтов (VBS >> JS)

martyn-k
Этот пункт на CS4 у меня ничего не выводит. Выбрал скрипт через первый пункт:

system.callSystem("wscript.exe D:\\Fonts.vbs");

Запускался этот:

GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")._
EnumValues &H80000002, "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts", Arr
For Each Name In Arr : S = S & vbCr & Name : Next
CreateObject("Scripting.FileSystemObject").CreateTextFile("D:\Fonts.txt",1).Write Mid(S, 2)

Всё записалось без висов.

14

Re: JS: Перечислить имена системных шрифтов (VBS >> JS)

Flasher
На AE CC 2015 тоже записалось.
Вы дали решение. ОГРОМНОЕ СПАСИБО!

15

Re: JS: Перечислить имена системных шрифтов (VBS >> JS)

martyn-k
Пожалуйста. Вот с этим бы ещё разобраться:

Возвращать значение напрямую рисковано (записывать его в переменную), Афтер бывало ждал-ждал, и зависал.

Как выглядела запись?

16

Re: JS: Перечислить имена системных шрифтов (VBS >> JS)

Думаю, не стоит трать время, зависания происходили после экспериментов с кавычками и с использованием параметра start:

system.callSystem("cmd.exe /c \" start cscript.exe D:\\info\\ae\\scripts\\TEST_TEMP_SCRIPTS\\fonts.vbs > D:\\fonts1.txt\"");

От его использования я отказался.
Мне понравилось это:

reg query HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts>D:\\f.txt

17

Re: JS: Перечислить имена системных шрифтов (VBS >> JS)

Я же привёл цитату. Там сказано о записи в переменные jsx-кода. А приводите опять вывод в файл.

18

Re: JS: Перечислить имена системных шрифтов (VBS >> JS)

Flasher, СПАСИБО!
Очень благодарен Вам за все Ваши варианты!
Пусть Господь благословит Вас на все доброе!!!

19

Re: JS: Перечислить имена системных шрифтов (VBS >> JS)

Вот, что получилось по итогу:


var fonts_arr = get_font_list (false).replace(/& /g, "\n").split("\n");
var w = new Window("palette {preferredSize: [300, 200]}", "", undefined, {resizeable:true});
w.add("dropdownlist", undefined, fonts_arr);
w.show();

function get_font_list (replace)
{ 
          var data_folder_name = "u_data";
          var fonts_file_name = "font_list.txt";
          var script_name = "get_fonts.vbs";
          if ($.os.indexOf("Windows") != -1)
          {
                 var data_folder = new Folder("~" + "\\" + data_folder_name);
                 if (!data_folder.exists) data_folder.create();
                 
                 var data_folder_fs_name = data_folder.fsName.replace(/\\/g, "\\\\");
                 
                 var system_fonts_folder = Folder(Folder.system.parent.fsName + "\\Fonts");

                 var font_list_file = new File(data_folder_fs_name + "\\" + fonts_file_name);

                 if (font_list_file.exists && (font_list_file.modified.getTime() > system_fonts_folder.modified.getTime()))
                 {
                        return read_txt (font_list_file);
                 }
                 
                 var script_fs_name = data_folder_fs_name + "\\" + script_name;
                                                      
                 var script_file = new File(script_fs_name);
                 if (!script_file.exists)
                 {
                        var vbs_code = 'GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\default:StdRegProv")._\
EnumValues &H80000002, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts", arrNames\
n = UBound(arrNames)\
Do\
    nn = -1\
    For j = LBound(arrNames) to n - 1\
        If arrNames(j) > arrNames(j + 1) Then : TempValue = arrNames(j + 1) : arrNames(j + 1) = arrNames(j) : arrNames(j) = TempValue : nn = j : End If\
    Next\
    n = nn\
Loop Until nn = -1\
For Each Name In arrNames : strValue = strValue & vbCrLf & Name : Next\
CreateObject("Scripting.FileSystemObject").CreateTextFile("' + data_folder_fs_name + '\\\\' + fonts_file_name + '",1).Write Mid(strValue, 2)';
                        script_file.open("w");
                        script_file.write(vbs_code);
                        script_file.close();
                 }
                 system.callSystem("wscript.exe " + data_folder_fs_name + "\\" + script_name);
                 return read_txt (font_list_file);
          }
          else
          {
                  //system.callSystem(); //тут пока пусто
           }
}

function read_txt (txt_file)
{
    txt_file.open("r");
    var content = txt_file.read();
    txt_file.close();
    return content;
}

Из кода, думаю, все понятно: сохраняется vbs-файл, потом он запускается и сохраняет txt-файл (это все Ваше). Если в системной папке со шрифтами произошли изменения, то нужно этот файл перезаписать, а иначе читать из него.
Со всеми сохранениями у меня это выполняется за 450 мс, из них чтение — 300 мс.

20

Re: JS: Перечислить имена системных шрифтов (VBS >> JS)

martyn-k
Зачем же сохранять и выполнять vbs, если можно то же самое на JS выполнить? о_0

21

Re: JS: Перечислить имена системных шрифтов (VBS >> JS)

Нет времени. И это работает.

22

Re: JS: Перечислить имена системных шрифтов (VBS >> JS)

По ощущениям тут много лишнего.