Character encoding 使用批处理脚本将包含西里尔文的文本文件复制到其他目标

Character encoding 使用批处理脚本将包含西里尔文的文本文件复制到其他目标,character-encoding,batch-file,Character Encoding,Batch File,我有很多文本文件要发送到不同的目的地,这取决于文件是否包含使用批处理脚本的西里尔字符。例如: All Files are located in C:\mydocs. The script will be monitoring this file. File one: contains all English characters > copy to C:\mydocs\English\ File two: Contains some Cyrillic characters > c

我有很多文本文件要发送到不同的目的地,这取决于文件是否包含使用批处理脚本的西里尔字符。例如:

All Files are  located in C:\mydocs. The script will be monitoring this file.

File one: contains all English characters > copy to C:\mydocs\English\
File two: Contains some Cyrillic characters > copy to C\mydocs\Contains_Cyrillic\

这可能吗?

这并不容易,因为cmd只能在扩展的ascii表上工作。 下面是一个文件,其中包含使用
type
命令打印的西里尔字母:
№Ўцсэьў∙°■╫▐┘╪▀┬┼╨╥┌╙╚╬╧└╤─╘├╒╔╩╦╟▄╓╞┴═╠(保加利亚西里尔语-可能与俄语、蒙古语等不同。)

不幸的是,
FINDSTR
命令不能很好地处理这些问题。 但是,如果这些文件包含的特定字符是西里尔字母,则可能存在:-)。您可以通过其十六进制代码检查西里尔字母。有一个
certutil
,或将其转储到十六进制。不是win xp native,但可以从microsoft.com下载。以下是十六进制代码:

ff e2 e5 f0 f2 fa f3 e8 ee ef e0 f1 e4 f4 e3 f5   
e9 ea eb e7 fc f6 e6 e1 ed ec f7 f9 f8 fe d7 de   
d9 d8 df c2 c5 d0 d2 da d3 c8 ce cf c0 d1 c4 d4   
c3 d5 c9 ca cb c7 dc d6 c6 c1 cd cc     
下面是代码:

@echo off
certutil -dump my.cirillyc.file | findstr /r ""ff" "e2" "e5" "f0" "f2" "fa" "f3" "e8" "ee" "ef" "e0" "f1" "e4" "f4" "e3" "f5" "e9" "ea" "eb" "e7" "fc" "f6" "e6" "e1" "ed" "ec" "f7" "f9" "f8" "fe" "d7" "de" "d9" "d8" "df" "c2" "c5" "d0" "d2" "da" "d3" "c8" "ce" "cf" "c0" "d1" "c4" "d4" "" "c3" "d5" "c9" "ca" "cb" "c7" "dc" "d6" "c6" "c1" "cd" "cc""

if %errorlevel% EQU 0 (
    copy my.cirillyc.file  C\mydocs\Contains_Cyrillic\
)

如果文件包含以下内容,则可能无法正常工作:╓╞┴═╠... 符号,但在更多情况下应该可以。要遍历目录中的所有文件,可以使用
for/f
循环将其包围起来,这取决于文本文件的编码方式。如果文件是unicode,那么我不确定如何测试

但是,如果文件扩展为ascii(每个字符1个字节),则字节>十进制127的含义取决于代码页。您无法确定文件是否包含西里尔文,但可以确定它是否包含一个大于127的字节,该字节可能是非英语字符

以下脚本应该可以在Windows XP和更高版本上运行-无需下载任何内容

它首先创建一个>=文件长度的文件,仅由字符“a”组成。然后,它使用FC进行二进制比较,并将结果通过管道传输到FINDSTR,FINDSTR查找>=0x80的值。如果找到一个,则返回ERRORLEVEL 1,否则返回ERRORLEVEL 0

@echo off
call :HasExtendedASCII %1 && (echo English) || echo Not English
exit /b

:HasExtendedASCII
setlocal enableDelayedExpansion
set "tempFile=%temp%\dummyFile%random%.txt"
<nul set /p "=A" >"!tempFile!"
set /a dummySize=1
for /l %%N in (1 1 32) do if !dummySize! lss %~z1 (set /a dummySize*=2 & type "!tempFile!" >>"!tempFile!")
fc /b "!tempFile!" %1|findstr /re " [89ABCDEF][0123456789ABCDEF]" >nul&& set rtn=1 || set rtn=0
del "!tempFile!"
exit /b %rtn%
@echo关闭
调用:HasExtendedASCII%1&&(echo英语)| | echo非英语
退出/b
:HasExtendedASCII
setlocal enableDelayedExpansion
设置“tempFile=%temp%\dummyFile%random%.txt”
“!tempFile!”
设置/a dummySize=1
对于(1 1 32)中的/l%%N,请执行“如果”!愚蠢!lss%~z1(set/a dummySize*=2&键入“!tempFile!”>>”!tempFile!”)
fc/b“!tempFile!”%1 | findstr/re“[89ABCDEF][0123456789ABCDEF]”>nul&set rtn=1 | | set rtn=0
del“!tempFile!”
退出/b%rtn%

我必须做一些研究,看看这台机器上是否有certutil。如果我这样做了,我会尝试一下,然后回来报告。谢谢这看起来很有希望,但不幸的是文件是unicode格式的。如果我先使用TYPE命令将它们转换为ascii,这仍然有效吗?@bniedermeyer-我不建议这样做。在使用TYPE转换为扩展ASCII时,必须确保设置了正确的代码页。使用能够直接处理unicode的工具会更安全。我读过FIND命令支持unicode,但我从未见过任何说明如何搜索unicode的文档。我建议您研究VBScript或JScript。或者PowerShell有一些unicode功能。