找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 163|回复: 4

[文本处理] 批处理转义所有的文本特殊字符

[复制链接]
发表于 3 天前 | 显示全部楼层 |阅读模式
读取:特殊字符转义成普通字符序列;
readline.bat

  1. @echo off
  2. setlocal disabledelayedexpansion
  3. for /f "delims=#" %%. in (
  4.         'prompt #$E# ^& echo on ^& for %%_ in ^( . ^) do rem'
  5. ) do (
  6.         set "_Esc=%%."
  7. )

  8. set _In= & set /p "_In="
  9. for /f "delims=" %%. in ("%_Esc%") do (
  10.         if defined _In (
  11.                 call set "_In=%%_In:"=%%.D%%"
  12.                 call set "_In=%%_In:!=%%.E%%"
  13.                 setlocal ENABLEDELAYEDEXPANSION
  14.                 (
  15.                         set "_In=!_In:^=%%.C!"
  16.                         set "_In2="
  17.                         :READLINE_Replace
  18.                         if defined _In (
  19.                                 if "!_In:~,1!" == "%%" (
  20.                                         set "_In2=!_In2!%_Esc%P"
  21.                                 ) else (
  22.                                         set "_In2=!_In2!!_In:~,1!"
  23.                                 )
  24.                                 set "_In=!_In:~1!"
  25.                                 goto READLINE_Replace
  26.                         )
  27.                         :READLINE_Replace2
  28.                         if defined _In2 (
  29.                                 if "!_In2:~,1!" == "%_Esc%" (
  30.                                         set "_In3=!_In3!$"
  31.                                 ) else if "!_In2:~,1!" == "$" (
  32.                                         set "_In3=!_In3!$$"
  33.                                 ) else if "!_In2:~,1!" == ":" (
  34.                                         set "_In3=!_In3!$A"
  35.                                 ) else (
  36.                                         set "_In3=!_In3!!_In2:~,1!"
  37.                                 )
  38.                                 set "_In2=!_In2:~1!"
  39.                                 goto READLINE_Replace2
  40.                         )
  41.                         echo.!_In3!
  42.                 )
  43.                 endlocal
  44.         )
  45. )
复制代码



写入:把转义字符序列替换回特殊字符;
writeall.cmd

  1. @echo off & setlocal ENABLEDELAYEDEXPANSION

  2. for /f "delims=" %%i in ('more') do (
  3.         set "_Out=%%~i"
  4.         set _OutBuf=
  5.         :WRITEALL_Loop
  6.         if "!_Out:~,2!" == "$$" (
  7.                 set "_OutBuf=!_OutBuf!$"
  8.                 set "_Out=!_Out:~2!"
  9.                 goto WRITEALL_Loop
  10.         ) else if "!_Out:~,2!" == "$E" (
  11.                 set "_OutBuf=!_OutBuf!^!"
  12.                 set "_Out=!_Out:~2!"
  13.                 goto WRITEALL_Loop
  14.         ) else if "!_Out:~,2!" == "$C" (
  15.                 set "_OutBuf=!_OutBuf!^^"
  16.                 set "_Out=!_Out:~2!"
  17.                 goto WRITEALL_Loop
  18.         ) else if "!_Out:~,2!" == "$D" (
  19.                 set "_OutBuf=!_OutBuf!^""
  20.                 set "_Out=!_Out:~2!"
  21.                 goto WRITEALL_Loop
  22.         ) else if "!_Out:~,1!" == "=" (
  23.                 set "_OutBuf=!_OutBuf!="
  24.                 set "_Out=!_Out:~1!"
  25.                 goto WRITEALL_Loop
  26.         ) else if "!_Out:~,1!" == " " (
  27.                 set "_OutBuf=!_OutBuf! "
  28.                 set "_Out=!_Out:~1!"
  29.                 goto WRITEALL_Loop
  30.         ) else if "!_Out:~,2!" == "$P" (
  31.                 set "_OutBuf=!_OutBuf!%%"
  32.                 set "_Out=!_Out:~2!"
  33.                 goto WRITEALL_Loop
  34.         ) else if "!_Out:~,2!" == "$A" (
  35.                 set "_OutBuf=!_OutBuf!:"
  36.                 set "_Out=!_Out:~2!"
  37.                 goto WRITEALL_Loop
  38.         ) else if defined _Out (
  39.                 set "_OutBuf=!_OutBuf!!_Out:~,1!"
  40.                 set "_Out=!_Out:~1!"
  41.                 goto WRITEALL_Loop
  42.         )
  43.         echo.!_OutBuf!
  44. )
复制代码


这两个必须写成单独的bat调用,不能直接call标号(setlocal以及一些环境问题)。

做了一定测试,应该没问题(希望别打脸)。
发表于 前天 07:37 | 显示全部楼层
高深

我仅仅是先定义Esc转义符  for /F %%a in ('echo prompt $E ^| cmd') do set "EscK=%%a",然后用 echo 或 set /p 来定义字符颜色、光标位置、清除内容……,浅显的很
发表于 前天 10:21 来自手机 | 显示全部楼层
那求个东西吧,把任意文本拖入,生成一个bat,运行这个bat输出一个一模一样的bat出来,名字加个re啥的区分原文件。
有些大于小于和数字挨着的文本会出问题,有时候需要^,有时候不需要。
 楼主| 发表于 前天 11:24 | 显示全部楼层
窄口牛 发表于 2026-4-6 10:21
那求个东西吧,把任意文本拖入,生成一个bat,运行这个bat输出一个一模一样的bat出来,名字加个re啥的区分 ...

其实这个帖子纯属娱乐,空行处理可能有问题/中文没有测试,
源文件含有非可显示字符比如escape也有问题,
只是输出的话可以考虑连文本一起打个压缩包,就没有这个需求了;
或者用 certutil -decode / certutil -decodehex
或者用 expand
或者用 dism /apply-image
或者任意其它语言(vbs/js/powershell)混编,
或者附带任意第三方/其它语言编译出的产品,
都比批处理实现坑少
发表于 前天 14:06 | 显示全部楼层
看不懂也支持
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-4-8 04:54

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表