Продолжу оффтопик на тему разбора командной строки HTA.
Serge Yolkin пишет:Уважаемый Rumata предложил абалденный алгоритм. Преобразование комстроки в массив параметров, практически, занимает одну строчку
Вы же сами в сообщении #28, используя метод .match(), уложились в единственный оператор! Я, правда считаю, что правильнее использовать другое регулярное выражение:
var Args=CommandLine.match(/(?:"[^"]*(?:"|\S)|\S)+/g);
— строка разделяется по подряд стоящим пробельным символам, не заключаемым между нечётной и чётной кавычками, считая их от начала строки, т.е. если ближайшая слева (для пишущих слева направо ) кавычка чётная, то пробельный символ не включается ни в какой из параметров, в противном случае — включается; в случае нарушения чётности числа кавычек — пробельные символы в конце строки теряются.
Такое же разделение за исключением того, что при нарушение чётности числа кавычек пробельные символы в конце строки будут не теряться, а включаться в последний параметр:
Замечу, что если в рассматриваемой строке не будет найдено ни одного совпадения,
т.е если командная строка пустая, что возможно в зависимости от способа запуска HTA (например, при запуске по ссылке из IE (после подтверждения)),
или она состоит их одних лишь пробельных символов (чего в данном случае быть не должно)
.match() вернёт значение null; если же в любом случае нужен массив, хотя бы и пустой:
var Args=CommandLine.match(regex)||[];
--------
В случае, если аргументы командной строки пердставляют собой список разделённых пробельными символами имён файлов, некоторые из которых, возможно, заключены в кавычки и при этом, возможно, содержат пробелы, разбор командной строки по правилам предложенным мною и другими уважаемыми соучастниками (Serge Yolkin, Rumata), по всей вероятности, не будет различаться, но в общем случае может не совпадать (проверено).
Берусь утверждать, что моё правило более правильное , т.к:
• по тому же правилу (с выбрасываньем лишних пробельных символов в конце при нарушении чётности числа кавычек) разбирается командная строка в командных файлах CMD.EXE за исключением того, что запятые и точки с запятой в командной строке приравнены к пробельным символам;
• по тому же правилу (без выбрасывания лишних пробельных символов в конце при нарушении чётности числа кавычек) разбирается командная строка в сценариях WSH и консольных приложениях на MS Visual С/C++ 6.0 за исключением того, что после разбора из параметров удаляются все кавычки (не только внешние!!);
• тем же правилом руководствуется сам MSHTA.EXE выделяя из списка своих параметров первый — путь к приложению (и оставляя остальные на усмотрение этого приложения); при этом если путь открывается кавычкой, то кавычкой он должен и закрываться — эти внешние кавычки в путь не включаются, но внутри них могут быть и другие кавычки; также символы, в частности кавычки и пробелы, в пути можно заменять их escape-кодами — это можно использовать во избежание распадения пути на части и для соблюдения баланса кавычек — такие сложные пути могут быть при использовании, например, протокола «javascript:», чтобы в этом убедиться рассмотрите команды:
mshta.exe javascript:"Hello, world!"; А это уже дополнительные параметры
mshta.exe "javascript: alert ( "Hello,%20world!%22);%20"Текст, который будет выведен на странице";"
mshta.exe "javascript: alert ( "Hello,%20world!%22);%20"Текст, который будет выведен на странице%22;" А это уже дополнительные параметры
mshta.exe javascript:alert('" - это кавычка'); location.href; // А это всё ещё путь к приложению, а не его аргументы