vbscript — кодировка текста в аргументах WScript

Я пытаюсь сгенерировать почтовые конфигурации и персонализированные подписи через командный файл, который читает список пользователей, шаблон и создает персонализированный вывод. Это сделано и работает:

@ECHO OFF
SETLOCAL ENABLEEXTENSIONS
GOTO begin
:writesignature
cscript //NoLogo replacetext.vbs "[NAME]" %1 signature.html stdout | cscript //NoLogo  replacetext.vbs "[JOB]" %3 stdin stdout | cscript //NoLogo replacetext.vbs "[EMAIL]" %2 stdin signature-%4.html
GOTO :end
:begin
FOR /F "tokens=1,2,3,4 delims=;" %%A IN ('TYPE people.lst') DO CALL :writesignature "%%A" "%%B" "%%C" %%D
:end

Чтобы выполнить замену текста, я создал replacetext.vbs, который позволяет мне заменить строку на oter и может быть передан по конвейеру, если stdin и stdout указаны как исходный и целевой файлы:

CONST ForReading = 1
CONST ForWritting = 2
CONST ForAppending = 8
CONST OpenAsASCII   = false
CONST OpenAsUnicode = true
CONST OpenAsDefault = -2
Const OverwriteIfExist = true
Const FailIfExist      = false
Const CreateIfNotExist = true
Const FailIfNotExist   = false
SET objFSO = CreateObject("Scripting.FileSystemObject")
SET objFILEINPUT = Wscript.StdIn
SET objFILEOUTPUT = Wscript.StdOut
IF (Wscript.Arguments.Count < 2) OR (Wscript.Arguments.Count > 4) THEN
Wscript.Echo "Not enought arguments"Wscript.Echo "replacetext ""<original>"" ""<replacement>"" "Wscript.Quit(1 MOD 255)
END IF
IF Wscript.Arguments.Count > 2 THEN
IF Wscript.Arguments(2) = "stdin" THEN
'       Wscript.Echo "Input: StdIn"ELSE
'       Wscript.Echo "Input: " + Wscript.Arguments(2)
SET objFILEINPUT = objFSO.OpenTextFile(Wscript.Arguments(2), ForReading, OpenAsASCII)
END IF
IF Wscript.Arguments.Count = 4 THEN
IF Wscript.Arguments(3) = "stdout" THEN
'           Wscript.Echo "Output: StdOut"ELSE
'           Wscript.Echo "Output: " + Wscript.Arguments(3)
IF objFSO.FileExists(Wscript.Arguments(3)) THEN
SET objFILEOUTPUT = objFSO.OpenTextFile(Wscript.Arguments(3), ForWritting, CreateIfNotExist, OpenAsASCII)
ELSE
SET objFILEOUTPUT = objFSO.CreateTextFile(Wscript.Arguments(3), OverwriteIfExist, OpenAsASCII)
END IF
END IF
END IF
END IF
strText = objFILEINPUT.ReadAll()
strNewText = Replace(strText, Wscript.Arguments(0), Wscript.Arguments(1))
objFILEOUTPUT.Write(strNewText)
objFILEOUTPUT.Close
objFILEINPUT.Close
Wscript.Quit(0 MOD 255)

Проблема в том, что когда я помещаю не-ASCII символы в ANSI / Windows-1250 в people.lst (Comunicación), пока он работает и читает их в консоли, показывая их (не конвертируя) как символы OEM (Comunicaci¾n) когда я записываю выходные файлы, они каким-то образом преобразуют их прозрачно, поэтому выходной файл в Windows показывает Comunicaci¾n вместо Comunicación,

После большой отладки я локализовал проблему ТОЛЬКО в аргументах (без автоматического преобразования в файле шаблона).

Как я могу отключить указанное прозрачное преобразование или преобразовать входные данные из ANSI в OEM, чтобы преобразование работало как задумано?

0

Решение

Проблема в том, что cmd.exe работает с другой кодовой страницей, чем cscript.exe/wscript.exe, У меня есть похожая проблема в Польше, где cmd.exe работает с кодовой страницей 852 (я считаю, что это для совместимости со старыми программами MS-DOS) и wscript.exe работает в родной кодовой странице Windows 1250.

Чтобы решить проблему, поместите следующую строку в начало командного файла:

mode con cp select=1250

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]