Страница 9 из 16
Добавлено: Чт ноя 07, 2013 12:39
Serge Yolkin
Вот, решил проблему с критерием "юникодности" имени файла:
Код: Выделить всё
var // проверяем на юникодность имена файлов, переданных короткими (8.3) именами
a=new ActiveXObject('Shell.Application'),
c=new ActiveXObject('MSScriptControl.ScriptControl'),
f=new ActiveXObject('Scripting.FileSystemObject'),
n=a.NameSpace(f.getParentFolderName(filename));
c.language='VBScript';
c.allowUI=false;
c.addCode(
'Function FC(E)\n'+
' FC = ""\n'+
' For i = 1 to Len(E)\n'+
' FC = FC & Chr(Asc(mid(E,i,1)))\n'+
' Next\n'+
'End Function\n'
);
Content=fb(fa(filename));
function fa(e){return(n.ParseName(f.getFileName(e)).path);}
function fb(e){var u=c.run('fc',e);return(f.fileExists(u)||f.folderExists(u));}
Asc, похоже, использует "общевиндовский" механизм замены символов Unicode, а видно файл после преобразования имени, или нет - пусть сама винда и разбирается. Попутно обнаружилось ещё одно воплощение проблемы с именами в плагине: папка с именем "Õ" не обрабатывается вообще, даже скриптом
Добавлено спустя 10 минут:
На VBS, пожалуй, покороче будет, но сейчас не до этого. Кстати, нет ли в VBS команды, преобразующей строку Unicode в строку ANSI целиком, не по одному символу в цикле?
Добавлено: Сб ноя 09, 2013 15:22
Flasher
Serge Yolkin писал(а):короткого (8.3), которое плагин радостно передаёт скрипту
Забыл спросить, это тоже только на 8-ке? На семёрке имя полностью передаётся.
И я правильно понимаю, что ты вернулся к варианту проверки по знакам вопроса? Если да, то по логике должно было бы хватить этого:
Код: Выделить всё
Content = "Нет"
For i = 1 to Len(FileName)
If Chr(Asc(Mid(FileName, i, 1))) = "?" Then
Content = "Да" : Exit For
End If
Next
Хотя вместо Да плагин возвращает почему-то пустое значение.

Добавлено: Сб ноя 09, 2013 18:22
Serge Yolkin
Flasher
Имя, например, "ЯÕ" у меня на всём коротким (точнее, более длинным, но валидным) передаётся, а "нормальные" - да, на семёрке нормально, на восьмёрке - коротким. Спасибо, что обратил внимание.
А проверка - нет, не по "?". Полное имя преобразуется с помощью Asc, результат скармливается fso.fileExists()|folderExists(). Если винда (точнее, её fileSystemObject) объект нашла - считаем имячко "ансишным", поскольку старые программы его тоже найдут. Если не нашла - что-то здесь не так...
Добавлено спустя 4 минуты:
Сейчас я конвертирую полное имя в цикле посимвольно, потому и спрашиваю:
Кстати, нет ли в VBS команды, преобразующей строку Unicode в строку ANSI целиком, не по одному символу в цикле?
Добавлено: Сб ноя 09, 2013 18:24
Flasher
Serge Yolkin
Wait a second. Но ведь по логике винда найдёт все имена, где нет знаков вопроса? Или нет?
Вопрос видел. Стандартных методов преобразования нет.
Боюсь, что у плагина проблемы с возвратом юникодных имён. К примеру àéÿüĄŀĦĤŕž.ext +
Код: Выделить всё
Content = CreateObject("Shell.Application").NameSpace(CreateObject("WScript.Shell").CurrentDirectory).ParseName(filename).Name
даёт пустое значение.
Добавлено: Сб ноя 09, 2013 18:44
Serge Yolkin
Flasher писал(а):винда найдёт все имена, где нет знаков вопроса
Не скажи... Пока я со всякими смайликами-солнышками игрался, на какие только варианты не насмотрелся. Да и цель - определить валидность имён для старых программ - так достигается более точно, чем построение собственных предпроложений.
Добавлено: Сб ноя 09, 2013 18:53
Flasher
Serge Yolkin
См. дописку. У тебя есть с этим проблемы?
Добавлено: Сб ноя 09, 2013 18:57
Serge Yolkin
Да, и это не единственный вариант имени, которое не обрабатывается плагином совсем. Даже, если скрипт не трогает имена, а делает что-нибудь другое. Придётся подождать юникодной версии плагина.
Добавлено: Вс ноя 10, 2013 20:35
Serge Yolkin
Ай нид хелп: в инишнике к старой версии был ключик, позволяющий обрабатывать и папки тоже, инишник в ходе экспериментов сильно пострадал, а в инишнике к последней версии этого ключа нет. Может кто-нибудь напомнить?
Добавлено: Вс ноя 10, 2013 21:20
Avada
Serge Yolkin
Все ключи, содержащиеся в старом инишнике, есть и в новом, хотя и с некоторыми вариациями, включая упоминание ParseDirs=0 в комментарии.
Добавлено: Вс ноя 10, 2013 21:24
Serge Yolkin
Avada
Точно. Спасибо.
Добавлено: Чт ноя 14, 2013 15:41
Serge Yolkin
Маленькое резюме моих "открытий":
- ключ LongName=0/1 переключает не длинные/короткие имена, как я думал, а длинные/полные имена, т.е. при 0 в filename только имя объекта, при 1 - имя с путём;
- ParseDirs=0 отключает не только обработку папок, но и некоторых файлов, таких как hiberfil.sys, pagefile.sys;
- плагином очень удобно пользоваться для подсветки определённых файлов/папок, если она нужна не часто, или, по крайней мере, не всегда: имя плагина и поля всегда одни и те же, настраиваем шаблон поиска и цвет для него, а в зависимости от подключенного скрипта подсвечиваться будет то что нужно;
- для отключения плагина можно создать пустой скрипт (нулевого размера) и переключаться на его секцию в инишнике;
- чтобы не захламлять папку плагина скрипты можно сложить в подпапку, или разложить по нескольким подпапкам, относительные пути вида Script=".\Scripts\test.js" в инишнике поддерживаются;
- если плагин заинтересовал не только меня, могу поделиться HTA утилиткой, которая навешивается на хоткей и позволяет менять активную секцию в инишнике;
прошу прощения, если это мой очередной велосипед, и всем нормальным людям всё это давно известно.
Добавлено: Чт ноя 14, 2013 17:02
Flasher
Serge Yolkin
Про hiberfil.sys, pagefile.sys не знал, да и не требовалось.
Serge Yolkin писал(а):- плагином очень удобно пользоваться для подсветки определённых файлов/папок, если она нужна не часто, или, по крайней мере, не всегда: имя плагина и поля всегда одни и те же, настраиваем шаблон поиска и цвет для него, а в зависимости от подключенного скрипта подсвечиваться будет то что нужно;
Не понял, пример приведи, пож-та.
Serge Yolkin писал(а):для отключения плагина можно создать пустой скрипт (нулевого размера) и переключаться на его секцию в инишнике;
Прямо таки отключения? Да и зачем?
Serge Yolkin писал(а):могу поделиться HTA утилиткой
На код глянуть можно. Хотя менять секцию можно и обычным путём.
Добавлено: Чт ноя 14, 2013 17:44
Serge Yolkin
Flasher
Просто другая логика работы с плагином:
Плагин подключен, в тотале настроен шаблон поиска (у меня - highlight_plugin=script.Result = "!", но это на вкус), в [colors] настроена подсветка ColorFilter1=>highlight. В подпапке Scripts папки плагина - несколько скриптов, детектирующих определённые файлы/папки, в script.ini для каждого создана секция, в Section= та самая заглушка, которая "зачем". Ничего не подсвечивается. При необходимости, или остром желании, по хоткею вызываем утилитку, выбираем интересующий скрипт - в тотале подсвечены желаемые элементы. Через так же выбираем заглушку - всё как было. Чтобы в утилитке отображалось что-то более вменяемое, чем имена секций, в инишнике, в следующей после названия каждой секции строчке пишем комментарий (начинается с точки_с_запятой). Вот утиль:
Код: Выделить всё
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html>
<html>
<head>
<title>Переключатель Script.wdx</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=8" />
<script type="text/jscript" language="JScript">
self.resizeTo(400,200);
self.moveTo(200,100);
</script>
<hta:application
applicationName="WDXScriptSwitcher-II"
border="thin"
icon="%SystemRoot%/system32/scrobj.dll"
id="HTApp"
innerBorder="no"
maximizeButton="no"
minimizeButton="no"
selection="no"
singleInstance="yes"
version="0.2"
/>
<style type="text/css">
*{color:navy;font:normal 14px/16px Arial;margin:0;padding:0;}
p{cursor:hand;padding:5px 10px;}
p:hover{background-color:yellow;}
</style>
</head>
<script type="text/jscript" language="JScript">
var
a=[],
f=new ActiveXObject('Scripting.FileSystemObject'),
o=HTApp.commandLine.replace(/^"|[^\\]+$/g,'')+'script.ini',p,q,r,s,t;
s=f.openTextFile(o);
t=s.readAll();
s.close();
q=t.match(/Section\=[^\n\r]+/)[0].split('=')[1];
a=t.match(/\[\w+\](\s*;\s*[^\n\r]*)?/g);
for(var i=0;i<a.length;i++){
r=a[i].split(/\s*;\s*/);
if(r[0]!='[Script]'){
p=document.createElement('P');
p.comment=r[0].replace(/^\[|\]$/g,'');
p.innerHTML='• '+(r.length>1?r[1]:r[0]);
p.attachEvent('onclick',fa);
if(p.comment==q)p.style.fontWeight='bold';
document.documentElement.appendChild(p);
}
}
function fa(e){
self.resizeTo(0,0);
self.moveTo(-100,-100);
var u,v;
t=t.replace(/Section\=[^\n\r]+/,'Section='+f.getFileName(e.srcElement.comment));
s=f.openTextFile('script.ini',2);
s.write(t);
s.close();
try{
with(new ActiveXObject('WScript.Shell'))
run(
expandEnvironmentStrings('%COMMANDER_PATH%\\PlugIns\\util\\tccp.exe')+' 540',
0,
true
);
}catch(e){}
window.close();
}
</script>
</html>
Добавлено: Пт ноя 15, 2013 18:37
Lev
Как вариант можно наделать ini файлов и копировать утилиткой нужный поверх script.ini, т.е. перезаписывать весь, вместо редактирования строк.
-----
Еще можно заводить отдельный script.lng для именования колонок.
Код: Выделить всё
[eng]
Result=ColumnName
[rus]
Result=ИмяКолонки
Добавлено: Пт ноя 15, 2013 19:31
Serge Yolkin
Lev
Можно и скрипты хранить в архиве, вместе с инишниками, а распаковывать скриптом парами, поверх имеющихся, но это хорошо для готовой сборки, в прцессе написания отлаживать лучше ничего не удаляя, а то я тут выше уже жаловался, что инишник потерял совсем. Перезаписал, блин... Зато, обжогшись, научил утилитку генерить инишник при его отсутствии (болванка, конечно, но для всех имеющихся скриптов, включая подпапки).