本帖最后由 tiandyoin 于 2023-8-4 21:38 编辑
- @goto :main_20230424_102850
-
- @Usage:
- cd /d "%~dp0" & call "字符串 Trim.bat" :Trim[Ext] arg1_name L[eft] R[ight]
-
- :main_20230424_102850
- @echo off||code by tiandyoin&title "字符串 Trim.bat"
- :: 约定 %~1 为 :Trim... 其中的一个标签(Label)。
- if "%~1"=="" (
- call :test_20230424_102850
- cd /d "%~dp0" & call "判断 双击运行 or 命令提示符窗口.bat" :where-am-i
- ) else (
- :: 即 call :Trim[Ext] arg1_name L[eft] R[ight]
- call %*
- )
- @goto :eof
-
- :test_20230424_102850
- @echo off&setlocal enabledelayedexpansion
- set "str= ""test.txt "". .. ... "
- echo [!str!]
- call :Trim str
- echo [!str!]
-
- set "str= ""test.txt "". .. ... "
- echo [!str!]
- call :Trim str "" ""
- echo [!str!]
-
- set "str= ""test.txt "". .. ... "
- echo [!str!]
- call :Trim str L, R
- echo [!str!]
-
- set "str= ""test.txt "". .. ... "
- echo [!str!]
- call :TrimExt str Right
- echo [!str!]
- @goto :eof
-
- @rem Usage:
- rem 需要调用者提供“延迟变量扩展环境”。
- :Trim <arg1_name [,L[eft] ,R[ight]]>
- @echo off&setlocal enabledelayedexpansion
- set fst=0
- set lst=0
- set "input=!%~1!"
- if /i not "%~2"=="L" if /i not "%~2"=="Left" if /i not "%~2"=="" goto :Trim.lTrim.EOF
- :Trim.lTrim
- set ch=!input:~0,1!
- @rem 如果 ch 是双引号,需要凑成对组成引用闭环。
- if not "!ch!!ch!"==" " if not "!ch!!ch!"==" " goto :Trim.lTrim.EOF
- set "input=!input:~1!"
- set /a fst+=1
- goto :Trim.lTrim
- :Trim.lTrim.EOF
- if /i not "%~2"=="R" if /i not "%~2"=="Right" if /i not "%~2"=="" if /i not "%~3"=="R" if /i not "%~3"=="Right" if /i not "%~3"=="" goto :Trim.EOF
- :Trim.rTrim
- set ch=!input:~-1!
- if not "!ch!!ch!"==" " if not "!ch!!ch!"==" " goto :Trim.EOF
- set "input=!input:~0,-1!"
- set /a lst-=1
- goto :Trim.rTrim
- :Trim.EOF
- if !lst!==0 (set "lst=") else (set "lst=,!lst!")
- endlocal & set "%~1=!%~1:~%fst%%lst%!"
- @goto :EOF
-
- @rem Usage:
- rem 需要调用者提供“延迟变量扩展环境”。
- rem 增加功能: 去除右边 '.'
- :TrimExt <arg1_name [,L[eft] ,R[ight]]>
- @echo off&setlocal enabledelayedexpansion
- set fst=0
- set lst=0
- set "input=!%~1!"
- if /i not "%~2"=="L" if /i not "%~2"=="Left" if /i not "%~2"=="" goto :TrimExt.lTrimExt.EOF
- :TrimExt.lTrimExt
- set ch=!input:~0,1!
- @rem 如果 ch 是双引号,需要凑成对组成引用闭环。
- if not "!ch!!ch!"==" " if not "!ch!!ch!"==" " goto :TrimExt.lTrimExt.EOF
- set "input=!input:~1!"
- set /a fst+=1
- goto :TrimExt.lTrimExt
- :TrimExt.lTrimExt.EOF
- if /i not "%~2"=="R" if /i not "%~2"=="Right" if /i not "%~2"=="" if /i not "%~3"=="R" if /i not "%~3"=="Right" if /i not "%~3"=="" goto :TrimExt.EOF
- :TrimExt.rTrimExt
- set ch=!input:~-1!
- if not "!ch!!ch!"==" " if not "!ch!!ch!"==" " if not "!ch!!ch!"==".." goto :TrimExt.EOF
- set "input=!input:~0,-1!"
- set /a lst-=1
- goto :TrimExt.rTrimExt
- :TrimExt.EOF
- if !lst!==0 (set "lst=") else (set "lst=,!lst!")
- endlocal & set "%~1=!%~1:~%fst%%lst%!"
- @goto :EOF
-
- @rem Usage:
- rem 需要调用者提供“延迟变量扩展环境”。
- rem 功能: 去除指定字符左右两边的其它字符。
- rem 方法:
- rem 使用 Set 替换英文双引号为中文双引号,替换指定字符等为双引号,
- rem 再使用 Set 去除引号两边字符,最后还原回英文双引号。
- rem %var:*"=set "var=%
- :TrimBesideAssigner <arg1_name [,%Assigner% ,L[eft] ,R[ight]]>
- REM 未完成
- @goto :EOF
复制代码
- 【测试用例】
-
- "转义字符.txt"
- 以下测试空行:
-
-
-
-
-
-
- 下面是 中国DOS联盟 @bjsh 的例子:
-
- "aou"eo
- 下面一行需要 findstr /n
- ;euou%^>
- ::::aeui
-
- :::E2uo alejou 3<o2io|
- ^aue||%ou
-
- aoue eou 2
- euo 8
- ege#6758!7^^9098!98%$&^
- ueyi^^^^aueuo2
- ~ ! @ # $ % ^ & * ( () " ok " No " <>nul
- ege#6758^^^!7^^^^9098^!98%$&^^
-
- ~ ! @ # $ %" ^ "& * ( () " ok " No " <>nul
- sdsdg:sadgs
-
- kl&>jl^k!tsd!21%mk%gd
- kl&>jlk^!tsd^!21%mk%gd
- dgssdgdg^gds^gdsa
-
- 下面是 CSDN @tiandyoin 的例子:
-
- @REM cmd [/c, /k] 命令中需要双引号的特殊字符是:
- @REM <white space>
- @rem & < > [ ] { } ^ = ; ! ' + , ` ~
- @REM 详见:
- @REM "批处理之家\ntcmds.chs.chm"
-
- @REM &()[]{}^=;!'+,`~
-
-
- %~
- %~:
- %~:=%
-
- :123
- :
- %a%
- !b!
- "%a%"
- "!b!"
- %%a%%
- ^!b^!
- %a!%b!
- !b%a!%
- %%a%
- ^!b!
- a"%b"%c"
- a"!b"!c"
- "a b " c"
- "a b "" c"
- ""a b "" c"
- ""a b "" c""
- """a b "" c"""
- (()((
- [\s\t ]
-
- :test"^!~:^=!" % ~:=% ^0&((()||><>> `@#$*-_+{{}[]]\;',.?/ %~0 !~0 %空变量% !空变量! %空变量:空值1=空值2% !空变量:空值1=空值2! "
- :test"^!~:^=!" % ~:=% ^0&((()||><>>^^ ^^^ ^^^^ `@#$*-_+{{}[]]\;',.?/ %~0 !~0 %空变量% !"空变量! %"空变量:空值1=空值2% !空变量:空值1=空值2! "
-
- 1:c:\3/%5:\%1 %* 2<1.bug "!a!>" & !b!<"!c!"|!d! "?4*6?%e%"%f%" && (( %!g!% || !%h%! )
-
- 1:c:\3/%5:\%1 %* 2<1.bug "!a!>" & !b^!<"=^^!c!"|!d^! "?4*6?%e%"+%f%" && (( %!g!% || !%h%! )
- 1:c:\3/%5:\%1 %* 2<1.bug !i! "!a!>" & !b^!<"=^^!c!"|!d^! "?4*6?%e%"+%f%" && (( %!g!% || !%h%! )
-
- " 1:c:\3/%5:\%1 %* 2<1.bug !i! "!a!>" & !b^!<"=^^!c!"|!d^! "?4*6?%e%"+%f%" && (( %!g!% || !%h%! ) ;euou%^>1.txt "
-
- "update-content": " <p>1.优化程序,提高稳定性,提升用户体验。</p><p>2.订阅即将到期增加提醒。</p><p>3.“我的套餐”中增加显示激活码和邮箱的信息。</p><p>4.优化激活失败提示信息。</p><p>5.程序多开问题优化处理。</p><p>6.windows平台网络诊断数据异常问题。</p><p>7.其它问题优化。</p>",
复制代码 没找到完美的方法,这是我自己写的,尽可能解决问题:
1. 单数个双引号
2. :: 开头的注释
3. ; 开头的隔行作用
4. !! 被误当成取值
5. %% 被误当成取值
6. %~ 闪退
7. ^^^^ 多个的折叠问题
使用 set 去除空格前需要转义特殊字符,因此我没采用这些方法,而使用循环逐一处理每一个字符 |