[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 aloha20200628 于 2024-7-23 14:37 编辑

回复 60# ppll2030

我说的过滤掉中英文空格+制表符构成的 ‘全空白行’,其中的中文空格即全角空格。delims表达式指定的这三个字符复制到代码区中有时会 ‘变形’ 不过知道此意你在自己的代码中调整就是了

TOP

本帖最后由 77七 于 2024-7-23 15:52 编辑

回复 57# ppll2030


   
去掉就行,提供两种方法...
  1. @echo off
  2. set "str=    1  2 3 *  ?    "
  3. set "str=x %str%"
  4. set "str=%str: =&echo;%"
  5. for /f "skip=1" %%a in ('echo %%str%%') do (
  6. echo [%%a]
  7. )
  8. pause
  9. for /f "tokens=*" %%a in ("    1  2 3 *  ?    ") do (
  10. set str=%%a
  11. if defined str (
  12. call set "str=%%str: =&echo;%%"
  13. for /f %%a in ('call echo %%str%%') do (
  14. echo [%%a]
  15. )
  16. )
  17. )
  18. pause
复制代码
bat小白,请多指教!谢谢!

TOP

本帖最后由 qixiaobin0715 于 2024-7-23 15:54 编辑

回复 59# ppll2030
1.排版美不美观个人看法不一,只要达到各列上下对齐的效果,调整列的宽度就是小kiss,增加或减少几个空格而已;
2.如果列数都懒得搞清楚,就太那个了吧。实际上要解决这个问题也不复杂,就是在原有代码外层加上goto循环,再if几下即可。个人感觉goto语句太过难看,很少使用此循环。

TOP

算字节长度其实也可以将文本转换为16进制字串进行计算和处理,而且不用担心任何特殊字符。
  1. @echo off&setlocal enabledelayedexpansion
  2. set "input=a.txt"&set /a m=line=1&set "act=set/p=,&set/a m=1"
  3. for %%i in ("%input%") do fsutil file creATenew "%input%.zero" %%~zi >nul
  4. (for /f "tokens=2" %%a in ('fc /b "%input%" "%input%.zero"^|findstr /irc:"[0-9A-F]*: [0-9A-F][0-9A-F] 00"') do (
  5.     if /i "%%a"=="0A" (echo,&set/a m=1,line+=1,col=0) else if /i "%%a"=="0D" (echo,
  6.         for %%l in (!line!) do for /l %%i in (1,1,!col!) do (
  7.             if !C%%i_%%l! gtr !C%%imax! set/a C%%imax=C%%i_%%l
  8.             set "C%%i_%%l="
  9.             ) ) else if /i "%%a"=="20" (%act%) else if /i "%%a"=="09" (%act%) else (
  10.                     set/p=%%a
  11.                     set /a col+=m,m=0
  12.                     set /a C!col!_!line!+=1
  13.                    )
  14.         ))<nul >"%input%.temp"
  15. (for /f "delims=" %%a in (%input%.temp) do (
  16.     set /a col=0
  17.     for %%i in (%%a) do (
  18.         set /a col+=1&set "space="
  19.         set /a size=C!col!max,len=size*2+2
  20.         for /l %%i in (1,1,!size!) do set "space=!space!20"
  21.         set "outstr=%%i!space!"
  22.         for %%i in (!len!) do echo,!outstr:~0,%%i!
  23.         )   
  24.     set /p =0d0a
  25. )   )<nul >"out_%input%"
  26. del /q "%input%.zero" "%input%.temp"
  27. certutil -decodehex -f "out_%input%" "out_%input%" >nul
  28. pause
复制代码
1

评分人数

TOP

嵌套变量延迟开关, 来消除文本中“!”的影响,弃用for %%i in (...) do...的方法,通吃文本中存在默认分隔符以及*?通配符等字符的影响,使用大多数人熟悉的cmd命令书写代码。感觉效率还可以:
  1. @echo off
  2. echo,>$1
  3. :a
  4. set Em=
  5. set /a colsn+=1
  6. if %colsn% equ 1 (
  7.     (for /f "tokens=1" %%i in (a.txt) do (echo,%%i&set Em=1))>temp
  8. ) else (
  9.     (for /f "tokens=1,%colsn%" %%i in (a.txt) do (echo,%%j&if not "%%j"=="" set Em=1))>temp
  10. )
  11. if not defined Em goto :b
  12. echo,>>temp
  13. findstr /n /o .* temp>$2
  14. setlocal enabledelayedexpansion
  15.     for /f "tokens=1,2 delims=:" %%i in ($2) do (
  16.         set /a m=%%j-x
  17.         set /a n=%%i-1
  18.         set "a!n!=!m!"
  19.         if !max! lss !m! set "max=!m!"
  20.         set "x=%%j"
  21.     )
  22. set /a n+=1
  23.     (for /f "delims=:" %%i in ('findstr /n .* temp') do (
  24.         set str1=
  25.         set str2=
  26.         set /p str1=
  27.         set /a z=max-a%%i
  28.         for /l %%k in (1,1,!z!) do set str2=!str2!
  29.         if %%i neq !n! echo,!str1!!str2!
  30.     ))<temp>$2
  31.     (for /f "tokens=1* delims=:" %%i in ('findstr /n .* $2') do (
  32.         endlocal
  33.         set /p Line1=
  34.         set Line2=%%j
  35.         setlocal enabledelayedexpansion
  36.         if "!Line1!"=="" (echo,!Line2!) else echo,!Line1!    !Line2!
  37.     ))<$1>b.txt
  38. type b.txt>$1
  39. endlocal
  40. if defined Em goto :a
  41. :b
  42. del temp $1 $2
  43. pause
复制代码

TOP

返回列表