@echo off
::因“自己的最新发现:在开启变量扩展后不允许变量的内容里有!符号”;
::此句若对谁产生了误导的,在这里表示道谦。
::原因是set "_str=%%i"此句时进行变量展开,并非是变量内容里不允许有“!”。
::现进行了改进,已经可以处理绝大多数字符了,除了汇编16进制小于2c的
::部分控制字符以外。
::对当前目录及以下的所有子录的TXT文件内含的“*”用该文件名代替;
::直接进行替换,不产生临时文件。
echo 正在处理(请稍候):
for /r %%a in (*.txt) do (
set "fn=%%~nxa"
set /p=%%~nxa <nul
for /f "tokens=* delims=" %%i in ('"(type %%~fa^&cd.^>%%~fa)"^|findstr /o .*') do (
set "_str=%%i"
setlocal ENABLEDELAYEDEXPANSION
rem 为了读取空行进行的处理,丢弃:号前的偏移号
set "_str=!_str:*:=!"
call :sub
echo.!_str!>>%%~fa
set /p=.<nul
endlocal
)
echo.完成
)
pause
endlocal
goto :eof
:sub
if not defined _str goto :eof
rem 对特殊字符进行转换处理
set "_str=!_str:"=""!"
set "_str=!_str:2=22!"
set "_str=!_str:""=525!"
set "_str=!_str:%%=323!"
:next
rem 因为*号的特殊,不能在变量内替换,只好在*号的处打断后换成代号121
rem 把*号前的去掉,取剩余字符串的长度,用来进行截串处理
set "_str2=!_str:**=!"
if "!_str!"=="!_str2!" goto :qu
set "str=!_str2!"&call :get _skip
set /a _skip+=1
set "_str=!_str:~0,-%_skip%!121!_str2!"
goto :next
:qu
rem 转换后的特殊字符恢复
set "_str=!_str:323=%%!"
set "_str=!_str:121=%fn%!"
set "_str=!_str:525="!"
set "_str=!_str:22=2!"
goto :eof
:get
rem 取字符的长度,返回值存在%1指定的变量
set n=0&set s=!str!
if not defined str set %1=0&goto :eof
:loop
set /a n=!n!+16
set "m=!s!fedcba9876543210"
set "s=!str:~%n%!"
if not "!s!"=="" goto loop
set /a %1=0x!m:~16,1!+!n!-15
goto :eof