|
|
发表于 2025-9-29 20:15:04
|
显示全部楼层
本帖最后由 aloha20200628 于 2025-9-30 10:06 编辑
回复 14# dzwind
因为需要全程开启变量延迟,所以文本行中包含的英文 ! 字符会被拦截,可用以下代码(修订13楼代码)解决这个问题,但运行效率会有折扣(尤其是处理成千上万行文本文件时),若楼主认可,也就算是一个比较完整的纯批解决方案了...
- @echo off &setlocal
- for /f "delims=" %%F in ('dir/s/b/a-d *.txt') do (
- (for /f "usebackq delims=" %%a in ("%%F") do set "x=%%a" &call echo,%%x:!=╫%%)>"#.$"
- setlocal enabledelayedexpansion &set/a "pm=1,qm=1"
- (for /f "delims=" %%a in (#.$) do (
- set "s=%%a" &set "s=!s:......=……!" &set "s=!s:--=——!" &set "_s=!s!"
- for %%n in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
- if "!_s:~%%n,1!" neq "" (set/a "ls+=%%n" &set "_s=!_s:~%%n!") )
- for /L %%n in (1,1,!ls!) do (
- set "c=!s:~,1!" &set "x=0"
- if "!c!" neq " " if "!c!" neq " " if "!c!" neq " " if "!c!" neq "?" (set "x=1")
- if !x! equ 0 (set "s=!s:~1!" &set/a "ls-=1") )
- for /L %%n in (0,1,!ls!) do (
- set "c=!s:~%%n,1!"
- if ^!c! == ^" (
- set/a "pm=0-!pm!"
- if !pm! equ -1 (set "c=“") else (set "c=”")
- ) else if "!c!" == "'" (
- set/a "qm=0-!qm!"
- if !qm! equ -1 (set "c=‘") else (set "c=’") )
- set "_line=!_line!!c!" )
- echo,!_line!&set "_line=" &set "ls=0" ) )>"$.#"
- endlocal
- (for /f "delims=" %%a in ($.#) do set "x=%%a" &call echo,%%x:╫=!%%)>"%%~F.new"
- )
- del /q #.$ $.# &pause&exit/b
复制代码 |
|