А пока никто не знает, что делать с п. 5, разобрался, наконец, с вопросом выполнения из-под JScript команд, да и прочих приложений в консоли cmd.
Ну это мне сейчас все очевидно: win-> dos -> запись в StdIn (dos) -> выполнение (dos) -> чтение StdOut (dos) -> win, а до этого тема порядком достала непонятками с корректным преобразованием кодировок.
Оформил в виде 2 функций (если надо больше модульности, легко встроить одну в другую):
/** Выполняет последовательно указанные аргументами команды в консоли cmd и возвращает вывод их выполнения одной строкой.
* Ввод-вывод в родной для WSH кодировке Win-1251, выполнение - в родной для консоли 866.
*/
function sExecDosCommand(sCommand, sAnotherCommand) {
if (arguments.length == 0) return "";
var oSh = WScript.CreateObject("WScript.Shell");
var oEx, oIn, oOut, sRes;
try {
oEx = oSh.Exec("cmd /k");
oIn = oEx.StdIn;
oOut = oEx.StdOut;
for ( var i = 0; i < arguments.length; i++)
oIn.WriteLine(sDOS2Win(arguments[i] + "", true));
oIn.WriteLine("exit");
sRes = sDOS2Win(oOut.ReadAll());
}
catch(e) {
return("Err. " + e.number + ": " + e.message);
}
//Минус внутренняя exit и последний перенос строки
return sRes.substring(0, sRes.lastIndexOf("\r\n", sRes.length - 3) - 2);
}
/** Возвращает текст sText преобразованный из кодировки cp866 (DOS) в windows-1251.
* Или наоборот - из 1251 в DOS - если флаг bInsideOut равен true.
*/
function sDOS2Win(sText, bInsideOut) {
var aCharsets = ["windows-1251", "cp866"];
sText += "";
bInsideOut = bInsideOut ? 1 : 0;
with (new ActiveXObject("ADODB.Stream")) { //http://www.w3schools.com/ado/ado_ref_stream.asp
type = 2; //Binary 1, Text 2 (default)
mode = 3; //Permissions have not been set 0, Read-only 1, Write-only 2, Read-write 3,
//Prevent other read 4, Prevent other write 8, Prevent other open 12, Allow others all 16
charset = aCharsets[bInsideOut];
open();
writeText(sText);
position = 0;
charset = aCharsets[1 - bInsideOut];
return readText();
}
}
Пример использования:
WScript.Echo("***" + sExecDosCommand("cd /d c:\\windows", "dir *.ini", "chcp", "echo Из командной строки") + "***");
WScript.Echo("WScript.Echo ФЫВА!");
Кириллица корректно обрабатывается как на этапе воода данных, так и на выводе.
Результат выполнения:
***D:\00\_0_assets\_files-args-run>cd /d c:\windows
C:\WINDOWS>dir *.ini
Том в устройстве C имеет метку bar_sys
Серийный номер тома: 682B-5C99
Содержимое папки C:\WINDOWS
07.05.2009 14:45 35 A5W.INI
8< пропущено >8
11.02.2011 16:24 323 win.ini
22 файлов 9 492 байт
0 папок 4 058 451 968 байт свободно
C:\WINDOWS>chcp
Текущая кодовая страница: 866
C:\WINDOWS>echo Из командной строки
Из командной строки***
WScript.Echo ФЫВА!
Кстати, я так и не смог понять, как работает механизм преобразования кодировок ADODB.Stream: почему надо вначале писать в поток в той кодировке, которую хотим получить, а затем читать в той, из которой преобразуем. И не один я задавался этим вопросом, и кто-то даже кажется постиг причины...
Но главное, работу функций проверил и перепроверил, ничего не напутано, они делают то, что должны делать, и называются правильно.