我有许多文本文件,我希望发送到不同的目的地,具体取决于文件是否包含使用批处理脚本的西里尔字符。例如:
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\
这可能吗?
答案 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
围绕它环