使用批处理脚本将包含Cyrillic的文本文件复制到其他目标

时间:2012-11-30 23:27:49

标签: 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 > copy to C\mydocs\Contains_Cyrillic\

这可能吗?

2 个答案:

答案 0 :(得分:1)

这取决于文本文件的编码方式。如果文件是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%

答案 1 :(得分:0)

这不是那么容易,因为cmd仅适用于扩展的ascii表。 这是一个包含用type命令打印的西里尔字母的文件: тхЁЄ·єшюярёфЇуїщъыч№Ўцсэьў∙°■╫▐┘╪▀┬┼╨╥┌╙╚╬╧└╤─╘├╒╔╩╦╟▄╓╞┴═╠(保加利亚语西里尔语 - 可能与俄语,蒙古语等有所不同......)

遗憾的是,FINDSTR命令对这些命令不起作用。 但是,如果这些文件中包含的唯一特定字符是西里尔字母可能有机会:-)。您可以通过其HEX代码检查西里尔字符。有certutil command that you can use to encode a file to hex,或将其转储为十六进制。没有赢得xp本机,但它可以从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围绕它环