标题: [文件操作] [已解决]批处理如何提取Unicode编码文件中的字符串 [打印本页]
作者: yuanyannian 时间: 2014-7-26 17:27 标题: [已解决]批处理如何提取Unicode编码文件中的字符串
Unicode 格式文件如下:
aaa.inf(韩文字符)
INTL_GEO_NATION="134"
50_GRAY="50% 회색"
ASTERISK="일반 메시지"
BOXES="네모"
BRICK="벽돌색"
CLOSE_PROGRAM="프로그램 닫기"
CRITICAL_BATTERY_ALARM="배터리 위험 수준 경보"
CRITICAL_STOP="시스템 오류"
CRITTERS="V자"
DEFAULT_BEEP="기본 경고음"
DEFAULT_SOUND="기본 경고음"
DESERT="황토색"
DEVICE_CONNECT="장치 연결"
DEVICE_DISCONNECT="장치 연결 해제"
DEVICE_FAIL="장치 연결 오류"
DIAMONDS="마름모"
EGGPLANT="가지색"
EMPTY_RECYCLE_BIN="휴지통 비우기"
EVENT_VIEWER="이벤트 뷰어"
EXCLAMATION="경고 메시지"
EXIT_WINDOWS_NT="Windows 종료"
GAMES="게임"
我的需求是:如何从aaa.inf 中提取某行(不是全部)等号后面的字符串(不是全部),比如 DIAMONDS="마름모" 中的 “마름모”(不要引号),输出到一个变量,或一个新的Unicode文件中。
谢谢大师们出手相助!
附件(源文件):
作者: terse 时间: 2014-7-26 19:17
回复 1# yuanyannian - @echo off
- for /f "tokens=2 delims==" %%i in ('find /i "DIAMONDS=" ^<au.txt') do set "str=%%~i"
- echo,%str%
- pause
复制代码
作者: yuanyannian 时间: 2014-7-26 20:19
回复 2# terse
谢谢,不过好像不行,运行后显示:
作者: DAIC 时间: 2014-7-26 22:01
回复 3# yuanyannian
把你的inf文件压缩之后上传到顶楼我试试
作者: yuanyannian 时间: 2014-7-26 22:21
本帖最后由 yuanyannian 于 2014-7-26 22:24 编辑
回复 4# DAIC
源文件已经上传到顶楼(附件),其实这是 Windows 安装源盘中注册表源文件,因为所涵盖所有国家的语言,所以是变量,不同的语言,等号后面的内容不一样的,但都是 unicode 编码字符。
作者: yuanyannian 时间: 2014-7-27 16:01
这个问题似乎有点难,既要正确的原样查找 Unicode 格式文件中的字符串(通常用 for /f %%i in () 到的已经是乱码了),又要写入到一个 Unicode 格式文件中。
个人观点:就目前的方法,采用普通的的文本,如 .txt、 .ini、 .bat好像都无法处理 Unicode 格式,那么我想,新写入的文件格式只能是注册表文件(.reg---保存为 unicode 格式应该可以运行),将变量以 .reg 的形式保存,用bat批处理导入这个 .reg 文件(反正我最终要的结果是注册表)。
作者: yuanyannian 时间: 2014-7-27 16:06
问题是:如何原样提取 Unicode 格式文件中的字符串,并且又原样写入到一个 Unicode 格式文件中。
我想肯定是有办法的,只是我不懂罢了,所以请老师们出手,谢谢了!!!
作者: CrLf 时间: 2014-7-27 19:59
本帖最后由 CrLf 于 2014-7-27 20:01 编辑
GB2312 编码是不支持韩文的,强行从 unicode 转为 扩展ASCII码 极易会丢失字符
949 代码页不知道为什么又没法用,1201 无效果,65001 在 xp 下又有问题
---------------------------------------------------------------------------------
powershell 默认输出就是 unicode:- ((select-string "DIAMONDS=" a.inf).line -split '"')[1]>b.inf
复制代码
perl 也可实现,非系统自带:- use Encode;
-
- open(IN,"<:encoding(utf-16)","a.inf");
- open(OUT,">b.inf");
- binmode(OUT, ":encoding(utf-16)");
- while(<IN>){
- print OUT ((split /"/)[1]) if /^DIAMONDS=/;
- }
复制代码
再来个 python...- import codecs
- import re
-
- text =open('a.inf', encoding='utf-16').read()
- text=re.sub(r'[\s\S]*DIAMONDS="(.*)"[\s\S]*','\g<1>',text)
- open('b.inf', 'w', encoding='utf-16').write(text)
复制代码
作者: yuanyannian 时间: 2014-7-27 20:20
回复 8# CrLf
恕我p盲,这几个如何使用?
作者: yuanyannian 时间: 2014-7-27 20:46
回复 8# CrLf
powershell 运行后是一个空的 b.inf
作者: DAIC 时间: 2014-7-28 12:34
回复 10# yuanyannian
什么操作系统?PowerShell的版本是?
作者: apang 时间: 2014-7-28 19:18
vbs 应该也可以- Set fso = CreateObject("Scripting.FileSystemObject")
- txt = fso.OpenTextFile("HIVEDEF.INF", 1, flase, -1).ReadAll
- Set re = New RegExp
- re.Pattern = "^DIAMONDS=""(.*)"""
- re.IgnoreCase = true
- re.Global = true
- re.MultiLine = true
- For Each m in re.Execute(txt)
- s = s & m.SubMatches(0) & vbCrLf
- Next
- fso.OpenTextFile("New_HIVEDEF.INF", 2, true, -1).Write s
复制代码
作者: yuanyannian 时间: 2014-7-28 19:39
回复 11# DAIC
我的操作系统是 Windows 7 x64,powershell 我看了好像是 v1.0
作者: DAIC 时间: 2014-7-29 10:05
回复 13# yuanyannian
Win7的PowerShell版本应该是2.0吧
C:\>powershell -c "Get-Host | Select-Object Version"
Version
-------
2.0
作者: yuanyannian 时间: 2014-7-29 19:52
回复 14# DAIC
是的,用你给的方法查看为 2.0
作者: 523066680 时间: 2014-7-29 20:52
回复 9# yuanyannian
perl保存为.pl格式 python保存为.py格式,把里面的文件名替换成正确的,同目录下运行
前提是装了perl或者python的解释器。
作者: CrLf 时间: 2014-7-29 22:15
回复 14# DAIC
以前我也以为是 1.0 的,后来才发现 win7 自带的其实是 2.0,被文件夹名骗了
作者: yuanyannian 时间: 2014-7-31 13:30
回复 12# apang
这个 vbs 脚本可以,但请教:
如何直接查找、替换 unicode 格式中的 字符串,并保持源文件格式不变?
作者: apang 时间: 2014-7-31 16:29
回复 18# yuanyannian - Set fso = CreateObject("Scripting.FileSystemObject")
- Set f = fso.OpenTextFile("HIVEDEF.INF", 1, false, -1)
- s = Replace(f.ReadAll, """마름모""", """菱形""")
- f.Close
- fso.OpenTextFile("HIVEDEF.INF", 2, true, -1).Write s
复制代码
保存为test.vbs, unicode编码
作者: yuanyannian 时间: 2014-7-31 17:01
回复 19# apang
太好了很成功,谢谢!!!
apang 老师,可否再帮忙写一个vbs(我是笨鸟):
1. 源文件见附件,是 unicode 格式,处理过程中及处理后要保持 unicode 格式不变。
2. 查找其中的 HKCU,",替换为 HKLM,"WB-default\。
3. 查找其中的 HKLM,"SYSTEM,替换为 HKLM,"WB-setup。
4. 查找其中的 HKLM,"SOFTWARE,替换为 HKLM,"WB-software。
5. 添加 [DEFAULTINSTALL] 一行。
6. 再添加 ADDREG = AddReg 一行。
先感谢!
源文件格式(节选):
作者: apang 时间: 2014-7-31 20:25
回复 20# yuanyannian
以后像这种与主题无关的问题请重新开贴- Set fso = CreateObject("Scripting.FileSystemObject")
- Set f = fso.OpenTextFile("test.txt", 1, false, -1)
- s = f.ReadAll : f.Close
- s = Replace(s, "HKCU,""", "HKLM,""WB-default\")
- s = Replace(s, "HKLM,""SYSTEM", "HKLM,""WB-setup")
- s = Replace(s, "HKLM,""SOFTWARE", "HKLM,""WB-software")
- s = "[DEFAULTINSTALL]" & vbCrLf & "ADDREG = AddReg" & vbCrLf & vbCrLf & s
- fso.OpenTextFile("test.txt", 2, true, -1).Write s
复制代码
作者: yuanyannian 时间: 2014-7-31 20:56
回复 21# apang
知道了,谢谢 apang 老师。
这个问题解决了大问题,再次感谢!!!
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |