Board logo

标题: [问题求助] poweshell 合并不同编码文本 [打印本页]

作者: 娜美    时间: 2024-5-7 15:18     标题: poweshell 合并不同编码文本

本帖最后由 娜美 于 2024-5-8 21:57 编辑

需要将不同编码文本合并,有ANSI  UTF8  带BOM UTF8   有UTF16LE  UTF16BE  Unix和dis格式的

文件夹下有很多文本,大概有3000个,将需要合并的1000多文件名称已经写进一个b.txt文本内了,只需要按b.txt内文件名先后顺序合并即可,防止文本前后行串接,在拼接处,需要留空一行。出来后的文本为ANSI编码,

合并过程中,如果产生识别不了文件名的或者没有此文件啥的原因。需要返回一个提示没有此文件的名称,失败名称存放在另一个文本中bug.txt

由于有不同编码文本,所以优先考虑用poweshell 来完成,代码最好是简单性能又快又准确又帅
谢谢各位poweshell大哥哥啦

基本模型构想
  1. #@&cls&powershell "type %~s0|out-string|iex"&pause
  2. $text = "b.txt"
  3. $out = "all.tmp"
  4. $FailName =bug.txt
  5. #读取b.txt内名称顺序列表
  6. Get-Content  $txt
  7. # 合并
  8. Get-Content $text.FullName | Add-Content $out
  9. # 失败的文件名称
  10. Get-Content $FailName
复制代码

1.txt
a
b
c

3.txt
d
e

2.txt
f
g


#  按b.txt 名单顺序先后次序合并,   名单长这样, 名称中文也有一些符号
1.txt
3.txt
2.txt


#  如果产生识别不了文件名的或者没有此文件啥的原因, 需写入报告
bug.txt
2.txt

#  将它们合并后样式
all.tmp
a
b
c

d
e

f
g
作者: czjt1234    时间: 2024-5-8 22:26

powershell不熟悉,vbs来一个
  1. Const b_txt    = "b.txt"
  2. Const out_text = "all.tmp"
  3. Const FailName = "bug.txt"
  4. Set oFSO = CreateObject("Scripting.FileSystemObject")
  5. Set oTextStream1 = oFSO.OpenTextFile(out_text, 2, True)
  6. Set oTextStream2 = oFSO.OpenTextFile(FailName, 2, True)
  7. Set oStream = CreateObject("ADODB.Stream")
  8. oStream.Type = 2    'adTypeText
  9. oStream.Mode = 3    'adModeReadWrite
  10. oStream.Charset = "GBK"
  11. oStream.Open()
  12. oStream.LoadFromFile b_txt
  13. arr = Split(oStream.ReadText(), vbCrLf)
  14. oStream.Close()
  15. For Each i In arr
  16.     If oFSO.FileExists(i) Then
  17.         oStream.Charset = checkCharset(i)
  18.         oStream.Open()
  19.         oStream.LoadFromFile i
  20.         s = oStream.ReadText()
  21.         oStream.Close()
  22.         s = RePlace(s, vbCrLf, vbCr)
  23.         s = RePlace(s, vbLf, vbCr)
  24.         s = RePlace(s, vbCr, vbCrLf)
  25.         oTextStream1.WriteLine s & vbCrLf
  26.     Else
  27.         oTextStream2.WriteLine i
  28.     End If
  29. Next
  30. MsgBox "ok"
  31. Function checkCharset(ByVal file)
  32.     Dim oStream, oRegExp, arr(), s
  33.     Set oStream = CreateObject("ADODB.Stream")
  34.     oStream.Type = 1    'adTypeBinary
  35.     oStream.Mode = 3    'adModeReadWrite
  36.     oStream.Open()
  37.     oStream.LoadFromFile file
  38.     If oStream.Size >= 2 Then
  39.         s = Hex(AscB(oStream.Read(1)))
  40.         s = s & Hex(AscB(oStream.Read(1)))
  41.         If s = "FFFE" Or s = "FEFF" Then
  42.             checkCharset = "Unicode"
  43.             Exit Function
  44.         End If
  45.     End If
  46.     oStream.Position = 0
  47.     ReDim arr(oStream.Size - 1)
  48.     For s = 0 To oStream.Size - 1
  49.         arr(s) = ChrW(AscB(oStream.Read(1)))
  50.     Next
  51.     oStream.Close()
  52.     s = "[\xC0-\xDF]([^\x80-\xBF]|$)"        & _
  53.         "|[\xE0-\xEF].{0,1}([^\x80-\xBF]|$)" & _
  54.         "|[\xF0-\xF7].{0,2}([^\x80-\xBF]|$)" & _
  55.         "|[\xF8-\xFB].{0,3}([^\x80-\xBF]|$)" & _
  56.         "|[\xFC-\xFD].{0,4}([^\x80-\xBF]|$)" & _
  57.         "|[\xFE-\xFE].{0,5}([^\x80-\xBF]|$)" & _
  58.         "|[\x00-\x7F][\x80-\xBF]"            & _
  59.         "|[\xC0-\xDF].[\x80-\xBF]"           & _
  60.         "|[\xE0-\xEF]..[\x80-\xBF]"          & _
  61.         "|[\xF0-\xF7]...[\x80-\xBF]"         & _
  62.         "|[\xF8-\xFB]....[\x80-\xBF]"        & _
  63.         "|[\xFC-\xFD].....[\x80-\xBF]"       & _
  64.         "|[\xFE-\xFE]......[\x80-\xBF]"      & _
  65.         "|^[\x80-\xBF]"
  66.     Set oRegExp = New RegExp
  67.     oRegExp.MultiLine = False
  68.     oRegExp.Pattern = s
  69.     checkCharset = "GBK"
  70.     If Not oRegExp.Test(Join(arr, "")) Then checkCharset = "UTF-8"
  71. End Function
复制代码

作者: aloha20200628    时间: 2024-5-8 23:48

本帖最后由 aloha20200628 于 2024-5-12 16:16 编辑

回复 1# 娜美

        powershell确实为转换文件编码提供了.net资源中可靠而高效的方法,但未能直接提供准确率较高的文件编码‘推测’方法。目前已被业界广为采用的文件编码‘推测’方法是源自火狐(firefox)提供的开源代码(如python/c#/java等已均有成熟的接口),还可从有关网站下载其专门编译好的命令行实用工具。如果已经安装了python环境及其chardetect应用,即可直接在其安装主目录下找到...\Scripts\chardetect.exe,用其在命令行直接运行即可获取指定文本文件的编码‘推测’结果。另一个便捷方法是从网址》https://github.com/JetDemo/uchardet 下载源自火狐开源代码采用c++编译好的命令行实用工具 uchardet.exe。
        以下给出的批处理代码就是利用uchardet.exe的‘推测’结果,据此调用powershell的[io.file]方法,实现 utf-8/utf-8+BOM/utf-16le/utf-16be 到简中编码(gb2312)的高速转换,顺便修复了源文件中的unix换行符,生成最终结果文件allinOne.txt。代码中另外附加了文件名分隔标注行,如不需要可删除第4行。
  1. @echo off &setlocal &del /q "allinOne.txt" "bug.txt" 2>nul
  2. for /f "delims=" %%F in (b.txt) do if not exist "%%~F" (echo,"badFile -- %%F"&echo,%%F>>"bug.txt") else (
  3. for /f "tokens=1-2 delims=-" %%a in (' uchardet.exe "%%~F" ') do (
  4. if /i "%%a" neq "unknown" (echo, /// %%~F ///>>"allinOne.txt")
  5. if /i "%%a"=="utf" if "%%b"=="8" (
  6. powershell "$s=[io.file]::readalllines('%%~F',[text.encoding]::utf8);[io.file]::appendalllines('allinOne.txt',$s,[text.encoding]::default)"
  7. ) else if /i "%%a"=="utf" if "%%b"=="16" (
  8. powershell "$s=[io.file]::readalllines('%%~F',[text.encoding]::unicode);[io.file]::appendalllines('allinOne.txt',$s,[text.encoding]::default)"
  9. )
  10. if /i "%%a"=="ascii" (
  11. more "%%~F">>"allinOne.txt"
  12. ) else if /i "%%a"=="gb18030" (
  13. more "%%~F">>"allinOne.txt"
  14. ) else if /i "%%a"=="unknown" (
  15. echo,"unknown -- %%F"&echo,%%F>>"bug.txt"
  16. )
  17. )
  18. echo,>>"allinOne.txt"
  19. )
  20. endlocal&pause&exit/b
复制代码

作者: 娜美    时间: 2024-5-9 10:42

谢谢2位大哥哥thanks
作者: 娜美    时间: 2024-5-9 10:59

回复 3# aloha20200628


   大哥哥 thanks 如果用poweshell可以直接合并所有文本应该是最直接的, 不用管它们是什么编码。 不做所有文件编码判断,  如果用的poweshell合并应该也不会出啥问题  另外poweshell合并时还可以提高一下速度吗
作者: czjt1234    时间: 2024-5-9 11:00

回复 4# 娜美


    运行结果反馈下,看看有没有问题
作者: 娜美    时间: 2024-5-9 11:07

本帖最后由 娜美 于 2024-5-9 11:11 编辑

回复 6# czjt1234


   大哥哥, 小文本可以没有问题 , 结果倒是正确, 只是有点慢,。它似乎是读写进内存去处理, 如果是有稍大一点文件, 会使内存挤满, 如果挤满了内存等很久都没出结果
作者: 娜美    时间: 2024-5-9 11:18

本帖最后由 娜美 于 2024-5-9 21:42 编辑

O K 谢 谢  thanks
作者: 娜美    时间: 2024-5-9 14:39

本帖最后由 娜美 于 2024-5-9 14:45 编辑

回复 3# aloha20200628


   aloha20200628 大哥哥,是不是似乎还可以做些优化 ?  uchardet.exe 它现在需要读完所有文本才能检测出编码, 这似乎要浪费这些没用的时间过程(因为要从头到尾读一遍)   

但是, 如果让它只读文本的前几行就能判断文本编码, 这是不是会更好 ?
作者: aloha20200628    时间: 2024-5-9 15:31

本帖最后由 aloha20200628 于 2024-5-12 16:14 编辑

回复 9# 娜美

楼主随便看看有关‘文件编码识别’为何至今未有终解的网页论述即知其中一二了...
好吧再给一个简单版本,就用本坛可下载的coder.exe置换3楼代码中的uchardet.exe,因前者不排查非文本文件类型故可使3楼代码进一步简化...
有劳powershell用.net的[io.file]方法,把utf-8/utf-8+BOM‘兄弟俩’一锅烩了,把utf-16be/utf-16le‘兄弟俩’也一锅烩了,为码农省事了...
  1. @echo off &setlocal &del /q "allinOne.txt" "bug.txt" 2>nul
  2. for /f "delims=" %%F in (b.txt) do if not exist "%%~F" (echo,"badFile -- %%F"&echo,%%F>>"bug.txt") else (
  3. for /f "tokens=1 delims=_" %%a in (' coder.exe -s -a gc -f "%%~F" ') do (
  4. echo, /// %%~F ///>>"allinOne.txt"
  5. if /i "%%a"=="utf-8" (
  6. powershell "$s=[io.file]::readalllines('%%~F',[text.encoding]::utf8);[io.file]::appendalllines('allinOne.txt',$s,[text.encoding]::default)"
  7. ) else if /i "%%a"=="utf-16" (
  8. powershell "$s=[io.file]::readalllines('%%~F',[text.encoding]::unicode);[io.file]::appendalllines('allinOne.txt',$s,[text.encoding]::default)"
  9. ) else if /i "%%a"=="ansi" (more "%%~F">>"allinOne.txt")
  10. )
  11. echo,>>"allinOne.txt"
  12. )
  13. endlocal&pause&exit/b
复制代码

作者: 娜美    时间: 2024-5-9 16:58

本帖最后由 娜美 于 2024-5-9 17:03 编辑

回复 10# aloha20200628


   谢谢大哥哥这次更帅了哦,  还请帮我看看8楼修改下, 准备另一个备用
作者: aloha20200628    时间: 2024-5-9 19:34

回复 11# 娜美

8楼代码段 for /r %%a in (*.txt) 只能获取按文件名升序排列的全路径文件名列表,效果与 dir /b/s/a-d *.txt 相同,1楼b.txt中的文件名被人为排序显然与其不符。在命令行运行 dir /? 即可了解》采用 dir 获取文件名列表可通过 文件名或扩展名升降序/文件尺寸/时间属性 来调整排序结果,没有其他更便捷的方法了...

作者: Five66    时间: 2024-5-9 20:17

快和准确不可兼得
简单跟帅也不可兼得
用第三方 file 也能获得编码 http://bcn.bathome.net/s/tool/index.html?key=file
作者: 娜美    时间: 2024-5-9 21:43

回复 12# aloha20200628


   thanks
作者: 娜美    时间: 2024-5-9 21:45

本帖最后由 娜美 于 2024-5-9 21:49 编辑

回复 13# Five66


   1楼(小容量文件)    3楼 and 10楼 是很好解决方案  帅的
作者: aloha20200628    时间: 2024-5-10 13:16

本帖最后由 aloha20200628 于 2024-5-10 13:24 编辑


文件编码转换方法在c/c++/c#/vbs/js/powershell/...都有成熟的功能实现,其中亦可采用非常高效的选项,但在文件编码检测方面目前仍是一个近似解,因此业界称其为‘推测’方法。
已经用过几款专用的文件编码推测工具:
   chardetect.exe 基于Mozilla(火狐浏览器出品商)开源代码,可在python的chardet应用资源中获取
   uchardet.exe 基于Mozilla开源代码,可在 https://github.com/JetDemo/uchardet 下载
   file.exe 属于GNU资源,可在本论坛第三方下载
使用中有一些区别简报如下》
chardetect / file / uchardet 均可排查非文本文件;
chardetect / file 可返回细分信息;
chardetect 对多种常用编码误判率最低,但反应也最慢尤其是对大数据;
file 对中文编码误判率明显。

作者: 娜美    时间: 2024-5-11 23:04

本帖最后由 娜美 于 2024-5-12 08:03 编辑

谢谢
作者: aloha20200628    时间: 2024-5-12 19:26


不仅系统命令more,而且powershell的gc/sc方法和[io:file]readAlllines/writeAlllines方法亦可修复源文件中的unix换行符,故重新订正了3楼和10楼代码,不必用more出手马后炮了。以前须烦劳正则替换来用'\r\n'规整文件中的多种换行符,其实极简之道是在命令行上跑一遍more就齐活了...

作者: 娜美    时间: 2024-5-12 22:41

本帖最后由 娜美 于 2024-5-13 15:25 编辑

回复 18# aloha20200628

powershell "$s=[io.file]::readalllines('%%~F',[text.encoding]::utf8);[io.file]::appendalllines('allinOne.txt',$s,[text.encoding]::default)"
大哥哥,用这个合并是不是会使内存挤满呢,我偿试制造一个比较大文件试了一下,观察了内存似乎是要挤满的,还弹出红色字体报告,除了这个写法外,还能有其他的替代它没?
作者: 娜美    时间: 2024-5-13 10:44

本帖最后由 娜美 于 2024-5-13 10:46 编辑

3楼代码 and 10楼代码一般大文件可以的,,    但较大文件就需要更多内存

这写法会挤满内存哦
  1. powershell "$s=[io.file]::readalllines('%%~F',[text.encoding]::utf8);[io.file]::appendalllines('allinOne.txt',$s,[text.encoding]::default)"
复制代码

作者: aloha20200628    时间: 2024-5-13 11:00

本帖最后由 aloha20200628 于 2024-5-13 12:46 编辑

回复 19# 娜美

网论有说硬件性能 ‘足够’ 即可令ps一口吞下1G大小的文件。
过去议论纯P的用法时,也常说不要碰其大(64M)小(8K)天花板。
小车超载,只能取 ‘细分多次’ 之策了,简单之举,或者改 ‘一次读取’ 为 ‘分行读取’,或者先将大文件按行数切成多个小文件,或者移步国内外专门的ps论坛求经盘道...
总之,都是 ‘时间换空间’ 的不同把戏而已...

作者: 娜美    时间: 2024-5-13 18:06

回复 18# aloha20200628


   似乎不用担心MAC/或unix换行符问题,  试过经过Poweshell处理的都会统一变成dos的换行符格式, So, 不需要再more
作者: aloha20200628    时间: 2024-5-13 18:50

本帖最后由 aloha20200628 于 2024-5-13 18:53 编辑

回复 22# 娜美

非也
如果1.txt采用utf-8编码+unix换行符,试试下式吧...
  1. powershell "$s=[io.file]::readalltext('1.txt',[text.encoding]::'utf8');[io.file]::writeAlltext('2.txt',$s,[text.encoding]::'default')"
复制代码
至少用powershell v4是不行滴 ...

作者: 娜美    时间: 2024-5-13 20:15

回复 23# aloha20200628


    嗯 确实不行还得要转
作者: czjt1234    时间: 2024-5-13 22:04

你说的大文件是多大,100M还是1G还是2G
作者: aloha20200628    时间: 2024-5-13 22:25

本帖最后由 aloha20200628 于 2024-5-13 22:32 编辑

回复 20# 娜美

‘一次性读写’ 改为 ‘逐行读写’ 方案》以便应付超大数据文件,不过还是采用了powershell中相当高效的[io.file]readLines/streamWriter
基于3楼代码改写如下,再试试吧...
  1. @echo off &setlocal &del /q "allinOne.txt" "bug.txt" 2>nul
  2. for /f "delims=" %%F in (b.txt) do if not exist "%%~F" (echo,"badFile -- %%F"&echo,%%F>>"bug.txt") else (
  3. for /f "tokens=1-2 delims=-" %%a in (' uchardet.exe "%%~F" ') do (
  4. if /i "%%a" neq "unknown" (echo, /// %%~F ///>>"allinOne.txt")
  5. if /i "%%a"=="utf" if "%%b"=="8" (
  6. powershell "$g=[text.encoding]::getEncoding('gb2312');$m=new-object io.streamWriter('allinOne.txt',$true,$g);foreach($l in [io.file]::readLines('%%~F',[text.encoding]::'utf8')){$m.writeLine($l)};$m.close()"
  7. ) else if /i "%%a"=="utf" if "%%b"=="16" (
  8. powershell "$g=[text.encoding]::getEncoding('gb2312');$m=new-object io.streamWriter('allinOne.txt',$true,$g);foreach($l in [io.file]::readLines('%%~F',[text.encoding]::'unicode')){$m.writeLine($l)};$m.close()"
  9. )
  10. if /i "%%a"=="ascii" (
  11. more "%%~F">>"allinOne.txt"
  12. ) else if /i "%%a"=="gb18030" (
  13. more "%%~F">>"allinOne.txt"
  14. ) else if /i "%%a"=="unknown" (
  15. echo,"unknown -- %%F"&echo,%%F>>"bug.txt"
  16. )
  17. )
  18. echo,>>"allinOne.txt"
  19. )
  20. endlocal&pause&exit/b
复制代码

作者: 娜美    时间: 2024-5-14 10:07

本帖最后由 娜美 于 2024-5-14 10:09 编辑

回复 26# aloha20200628
  1. powershell "$g=[text.encoding]::getEncoding('gb2312');$m=new-object io.streamWriter('allinOne.txt',$true,$g);foreach($l in [io.file]::readLines('%%~F',[text.encoding]::'utf8')){$m.writeLine($l)};$m.close()"
复制代码
poweshell 逐行读写速度是每秒 4Mb/s 左右。大哥哥 这是不是poweshell最快的写法了 ?
作者: aloha20200628    时间: 2024-5-14 10:50

回复 27# 娜美

用你的各种实例测试比对,即可一目了然了 也许老东家对很容易拖后腿的 ‘逐行读取’ 给予了 ‘特别关照’...


作者: 娜美    时间: 2024-5-15 15:11

本帖最后由 娜美 于 2024-5-15 16:22 编辑

回复 28# aloha20200628


   大哥哥写了一个用gc的  单测它可以达到30mb/s


  返回错误,  我是不是变量没写好 ?  请帮看看
  1. @echo off &setlocal &del /q "allinOne.txt" "bug.txt" 2>nul
  2. for /f "delims=" %%F in (b.txt) do if not exist "%%~F" (echo,"badFile -- %%F"&echo,%%F>>"bug.txt") else (
  3. for /f "tokens=1 delims=_" %%a in (' coder.exe -s -a gc -f "%%~F" ') do (
  4. echo, /// %%~F ///>>"allinOne.txt"
  5. if /i "%%a"=="utf-8" (
  6. powershell "$a=gc -readcount 10000000 -enc:UTF8 "%%~F" | ac -enc:default all.tmp"
  7. ) else if /i "%%a"=="utf-16" (
  8. powershell "$a=gc -readcount 10000000 -enc:UTF16 "%%~F" | ac -enc:default all.tmp"
  9. ) else if /i "%%a"=="ansi" (
  10. powershell "$a=gc -readcount 10000000 -enc:default "%%~F" | ac -enc:default all.tmp"
  11. )
  12. )
  13. echo,>>"allinOne.txt"
  14. )
  15. endlocal&pause&exit/b
复制代码

作者: aloha20200628    时间: 2024-5-15 15:53

回复 29# 娜美

顺便提一句》有人实测过,设置 -readcount 1000 的效果极佳
  1. powershell "gc *.txt -readcount 1000 -enc 'utf8'|ac 'all.tmp'"
复制代码

作者: 娜美    时间: 2024-5-15 16:18

本帖最后由 娜美 于 2024-5-15 16:35 编辑

回复 30# aloha20200628
  1. powershell "gc *.txt -readcount 1000 -enc 'utf8'|ac 'all.tmp'"
复制代码
我套不进去,   脑壳不够用
作者: aloha20200628    时间: 2024-5-15 17:24

本帖最后由 aloha20200628 于 2024-5-15 17:28 编辑

回复 31# 娜美

管道是效率大杀器尤其是对大数据,尽量不用...
  1. @echo off &setlocal &del /q "allinOne.txt" "bug.txt" 2>nul
  2. for /f "delims=" %%F in (b.txt) do if not exist "%%~F" (echo,"badFile -- %%F"&echo,%%F>>"bug.txt") else (
  3. for /f "tokens=1 delims=_" %%a in (' coder.exe -s -a gc -f "%%~F" ') do (
  4. echo, /// %%~F ///>>"allinOne.txt"
  5. if /i "%%a"=="utf-8" (
  6. powershell "$s=gc '%%~F' readcount 1000 -enc 'utf8';ac 'allinOne.txt' $s"
  7. ) else if /i "%%a"=="utf-16" (
  8. powershell "$s=gc '%%~F' readcount 1000 -enc 'unicode';ac 'allinOne.txt' $s"
  9. ) else if /i "%%a"=="ansi" (more "%%~F">>"allinOne.txt")
  10. )
  11. echo,>>"allinOne.txt"
  12. )
  13. endlocal&pause&exit/b
复制代码

作者: 娜美    时间: 2024-5-15 19:42

本帖最后由 娜美 于 2024-5-15 19:53 编辑

回复 32# aloha20200628

有问题,  只合并了ANSI编码文本,  UTF8  UTF16编码文本一个都没有被合并进去
似乎是这2 powershell写法原因

powershell "$s=gc '%%~F' readcount 1000 -enc 'utf8';ac 'allinOne.txt' $s"
powershell "$s=gc '%%~F' readcount 1000 -enc 'unicode';ac 'allinOne.txt' $s"


似乎是读取变量文件和ac问题
$s=gc '%%~F' readcount 1000
作者: aloha20200628    时间: 2024-5-15 20:50

回复 33# 娜美

为何从[io:file]高效方法回退管道模式呢

作者: 娜美    时间: 2024-5-15 21:02

本帖最后由 娜美 于 2024-5-15 21:13 编辑

回复 34# aloha20200628

[io:file] 依靠内存模式
虽然也快  但抑制不了内存挤满问题




[io:file] 逐行读取模式   
速度4mb/s左右


速度30mb/s左右, 肯定是最快最佳方案,  但是代码套不进去
powershell "gc *.txt -readcount 1000 -enc:'default' | ac -enc:default 'all.tmp'"

另外more 也有些问题,要弃用, 大一点100mb文件会卡住不动

-- More (0%) --
作者: aloha20200628    时间: 2024-5-15 21:37

回复 35# 娜美

用以下5行代码替换32楼代码中的5-9行,再试吧...
  1. if /i "%%a"=="utf-8" (
  2. powershell " gc '%%~F' readcount 1000 -enc 'utf8'|ac 'allinOne.txt' "
  3. ) else if /i "%%a"=="utf-16" (
  4. powershell " gc '%%~F' readcount 1000 -enc 'unicode'|ac 'allinOne.txt' "
  5. ) else if /i "%%a"=="ansi" (powershell " gc '%%~F' readcount 1000|ac 'allinOne.txt' ")
复制代码

作者: 娜美    时间: 2024-5-15 23:23

本帖最后由 娜美 于 2024-5-15 23:32 编辑

回复 36# aloha20200628
大哥哥32楼那个可以了
大哥哥请看看  套进这个里面 似乎返回一些错误
  1. @echo off &setlocal &del /q "allinOne.txt" "bug.txt" 2>nul
  2. for /f "delims=" %%F in (b.txt) do if not exist "%%~F" (echo,"badFile -- %%F"&echo,%%F>>"bug.txt") else (
  3. for /f "tokens=1-2 delims=-" %%a in (' uchardet.exe "%%~F" ') do (
  4. if /i "%%a" neq "unknown" (echo, /// %%~F ///>>"allinOne.txt")
  5. if /i "%%a"=="utf" if "%%b"=="8" (
  6. powershell " gc '%%~F' -readcount 1000 -enc 'utf8'|ac 'allinOne.txt' "
  7. ) else if /i "%%a"=="utf" if "%%b"=="16" (
  8. powershell " gc '%%~F' -readcount 1000 -enc 'utf16'|ac 'allinOne.txt' "
  9. )
  10. if /i "%%a"=="ascii" (
  11. powershell " gc '%%~F' -readcount 1000 -enc 'ascii'|ac 'allinOne.txt' "
  12. ) else if /i "%%a"=="gb18030" (
  13. powershell " gc '%%~F' -readcount 1000 -enc 'default'|ac 'allinOne.txt' "
  14. ) else if /i "%%a"=="unknown" (
  15. echo,"unknown -- %%F"&echo,%%F>>"bug.txt"
  16. )
  17. )
  18. echo,>>"allinOne.txt"
  19. )
  20. endlocal&pause&exit/b
复制代码
  1. Get-Content : 无法绑定参数“Encoding”。无法将值“utf16”转换为类型“Microsoft.PowerShell.Commands.FileSystemCmdletProviderEncoding”。错误:“无法将标识符名称 utf16 与有效的枚举器名称相匹配。请指定以下枚举器名称之一,然后重试:
  2. Unknown, String, Unicode, Byte, BigEndianUnicode, UTF8, UTF7, UTF32, Ascii, Default, Oem, BigEndianUTF32”
  3. 所在位置 行:1 字符: 47
  4. +  gc 'UTF16BE-UNIX编码.txt' -readcount 1000 -enc 'utf16'|ac 'allinOne.tx ...
  5. +                                               ~~~~~~~
  6.     + CategoryInfo          : InvalidArgument: (:) [Get-Content],ParameterBindingException
  7.     + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.GetContentCommand
复制代码

作者: aloha20200628    时间: 2024-5-15 23:38

回复 37# 娜美

37楼代码第8行改为下行即可...
  1. powershell " gc '%%~F' -readcount 1000 -enc 'unicode'|ac 'allinOne.txt' "
复制代码

作者: 娜美    时间: 2024-5-16 08:15

回复 38# aloha20200628


   噢,真晕呀,我竟然没注意到这个,可能试多了晕了吧。好了,追求得到完满结束,多谢大哥哥哈




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2