Vbscript WScript参数上的文本编码

Vbscript WScript参数上的文本编码,vbscript,wsh,Vbscript,Wsh,我试图通过一个批处理文件生成邮件配置和个性化签名,该批处理文件读取用户列表、模板,并创建个性化输出。这已经完成并且有效: @ECHO OFF SETLOCAL ENABLEEXTENSIONS GOTO begin :writesignature cscript //NoLogo replacetext.vbs "[NAME]" %1 signature.html stdout | cscript //NoLogo replacetext.vbs "[JOB]" %3 stdin stdout

我试图通过一个批处理文件生成邮件配置和个性化签名,该批处理文件读取用户列表、模板,并创建个性化输出。这已经完成并且有效:

@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)
CONST ForReading=1
常量forwriting=2
出现的常数=8
CONST OpenAsASCII=false
常量openasonicode=true
常量OpenAsDefault=-2
Const OverwriteIfExist=true
Const FailIfExist=false
Const CreateIfNotExist=true
Const FailIfNotExist=false
设置objFSO=CreateObject(“Scripting.FileSystemObject”)
设置objFILEINPUT=Wscript.StdIn
设置objFILEOUTPUT=Wscript.StdOut
如果(Wscript.Arguments.Count<2)或(Wscript.Arguments.Count>4),则
Echo“没有足够的参数”
Wscript.Echo“replacetext”“”“”
Wscript.Quit(1 MOD 255)
如果结束
如果Wscript.Arguments.Count>2,则
如果Wscript.Arguments(2)=“stdin”,则
'Wscript.Echo“输入:StdIn”
其他的
“Wscript.Echo”输入:“+Wscript.Arguments(2)
设置objFILEINPUT=objFSO.OpenTextFile(Wscript.Arguments(2),ForReading,OpenAsASCII)
如果结束
如果Wscript.Arguments.Count=4,则
如果Wscript.Arguments(3)=“stdout”,则
'Wscript.Echo“输出:StdOut”
其他的
“Wscript.Echo”输出:“+Wscript.Arguments(3)
如果objFSO.FileExists(Wscript.Arguments(3)),那么
设置objFILEOUTPUT=objFSO.OpenTextFile(Wscript.Arguments(3)、forwriting、CreateIfNotExist、openasasii)
其他的
设置objFILEOUTPUT=objFSO.CreateTextFile(Wscript.Arguments(3),OverwriteIfExist,OpenAsASCII)
如果结束
如果结束
如果结束
如果结束
strText=objFILEINPUT.ReadAll()
strNewText=Replace(strText,Wscript.Arguments(0),Wscript.Arguments(1))
objFILEOUTPUT.Write(strNewText)
objFILEOUTPUT.Close
objFILEINPUT.Close
Wscript.Quit(0 MOD 255)
问题是,当我在people.lst(
Comunicación
)中将ANSI/Windows-1250中的非ASCII字符放入时,它在控制台中工作并读取这些字符,并在我编写输出文件时将它们(不转换)显示为OEM字符(
Comunicaci¾n
),因此,Windows中的输出文件显示的是
Comunicaci¾n
,而不是
Comunicación

经过大量调试,我只在参数中定位了问题(模板文件上没有自动转换)


如何禁用所述透明转换,或将输入从ANSI转换回OEM以使转换按预期工作?

问题在于
cmd.exe
cscript.exe/wscript.exe
使用不同的代码页。我在波兰也有类似的问题,
cmd.exe
与codepage 852一起工作(我相信这是为了与旧的MS-DOS程序兼容),而
wscript.exe
在Windows的本机代码页1250中工作

要解决此问题,请在批处理文件的开头放置以下行:


mode con cp select=1250

问题在于
cmd.exe
cscript.exe/wscript.exe
使用不同的代码页。我在波兰也有类似的问题,
cmd.exe
与codepage 852一起工作(我相信这是为了与旧的MS-DOS程序兼容),而
wscript.exe
在Windows的本机代码页1250中工作

要解决此问题,请在批处理文件的开头放置以下行:

mode con cp select=1250