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


    还是老大厉害啊。完美解决列数问题,还有全角空格等字符的问题。代码依旧如此简单明了。

TOP

回复 38# aloha20200628


    老大,发现一个bug:
如果某组字符中带有*号,这组字符就会被整体抹掉。
而带有英文"!"感叹号的,只会是感叹号抹掉,不会影响这组字符的其他字符。
貌似你的代码第7行中分别提取每行中每组字符的时候,带*号的这组就会被抹掉。
我自己用tokens来提取不会有这个问题,但是我的代码太繁琐,也有列数限制。
所以还是倾向于你的代码,请问可有解决办法?

TOP

回复 47# ppll2030
感叹号的问题是变量延迟造成的,你可以试试如果感叹号成对出现,感叹号以及一对感叹号之间的字符都会“隐藏”。*的问题没有遇见过,还是留给大佬们来解释吧。

TOP

回复 41# buyiyang
是的,相似的字符还有分号、跳格。

TOP

本帖最后由 aloha20200628 于 2024-7-23 11:19 编辑


若批处字符串里包含转义字符,有如一旦撞上 “台风” 就是 “天灾”,只能尽量减免吧...
更新35楼代码如下,用递归子过程替换 for %%s in (%%a) do ... 以便纠正 ,;= 等其余系统默认分隔符以及*?通配符的影响...
  1. @echo off &setlocal &set "maxZ=0"
  2. for /f "delims=" %%a in (1.txt) do for /f "delims=   " %%b in ("%%a") do (
  3. set "a=%%a"&call :getMaxZ
  4. call set/p=%%maxZ%%<nul>0.0
  5. set/p maxZ=<0.0
  6. )
  7. for /f "delims=" %%a in (1.txt) do for /f "delims=   " %%b in ("%%a") do (set "a=%%a"&set "ss="&call :printAll)
  8. del/q "0.0" 2>nul&endlocal &pause &exit/b
  9. :getMaxZ
  10. for /f "tokens=1* delims=   " %%1 in ("%a%") do (set "a=%%2"&set/p="%%1"<nul>"0.0")
  11. if "%a%"=="" (exit/b) else for %%v in (0.0) do (set "v=%%~zv")
  12. (if %v% gtr %maxZ% set "maxZ=%v%") & goto :getMaxZ
  13. :printAll
  14. for /f "tokens=1* delims=   " %%1 in ("%a%") do (set "s=%%1"&set "a=%%2"&set/p="%%1"<nul>"0.0")
  15. for %%v in (0.0) do (set/a "z=maxZ-%%~zv")
  16. setlocal enabledelayedexpansion &set "_s=" &for /l %%k in (1,1,!z!) do (set "_s=!_s! ")
  17. set "ss=!ss! !s!!_s!" &if "%a%"=="" (set/p="!ss:~1!"<nul&echo,&endlocal&exit/b)
  18. endlocal &set "ss=%ss%" &goto :printAll
复制代码

TOP

回复 47# ppll2030


  
  1. for %%a in (1 2 *xx ?xx 5) do echo %%a
复制代码
含有通配符,*?,又没有通配到文件,自然就消失了。
bat小白,请多指教!谢谢!

TOP

本帖最后由 qixiaobin0715 于 2024-7-22 17:02 编辑

自己又偷偷的写了一个代码,对for默认分隔符和通配符 *?以及延迟变量中的 ! 免疫,效率不行,没好意思发出来。

TOP

回复 51# 77七
回复 48# qixiaobin0715

感谢两位大佬的指点。原因是已经找到了。只是想知道有没有什么好的经验或是取巧的办法可以避免这些通配符。
毕竟还想保持这么精简而干练的代码

TOP

回复 50# aloha20200628


    厉害了。换一个思路就搞定了特殊符号问题。这思维真是服了。

不过又有一个新问题: 对于包含有空格或制表符的空行(整行都不显示字符的,看着就像一空行),脚本会卡住,无法进行下去。

不过这不是很大的问题。我目前是加一段去除所有空行的命令,再继续执行就完美了。

再次感谢老大,通过这几段,学习到了很多。

TOP

回复 53# ppll2030


   50楼大佬已经给出答案了。如果没有其它特殊字符,只有通配符,也可以试试以下思路(老帖子看到的),将行变成竖排
  1. @echo off
  2. set "str=1  2 3 *  ?    "
  3. set "str=%str: =&echo;%"
  4. for /f %%a in ('echo %%str%%') do (
  5. echo [%%a]
  6. )
  7. pause
复制代码
bat小白,请多指教!谢谢!

TOP

本帖最后由 qixiaobin0715 于 2024-7-24 09:40 编辑

回复 53# ppll2030
字符串分行显示时,不使用for %%a in (...) do...这样的循环结构,可以避免出现默认分隔符以及*?通配符的影响;
至于变量延迟中!会”隐藏“的问题有多种解决方法,其中一种方法可以参考http://www.bathome.net/thread-11193-1-1.html

TOP

回复 55# 77七


    哈哈。果然有取巧的办法。感谢指导

不过这个用在这里会引发另一个bug

当每行开头是几个空格开始的情况,取值第一个会是ECHO

TOP

本帖最后由 aloha20200628 于 2024-7-23 11:18 编辑

回复 54# ppll2030

更新了50楼代码,滤掉了全空白字符行(仅包含中英文空格+制表符),以免运行中被阻塞...

TOP

回复 56# qixiaobin0715


    你的代码有些还看不明,需要研究一下
不过31楼的大佬,貌似也是按列来取值,然后根据每列最大字符串得到每列最大宽度。从而使得结果排版更加的完美。
而它第一段可以自动识别最大的列数。不需要手动填写,或许可以借鉴到你的代码里。
他的代码后半段很复杂。我一时半会不能理解透。
等研究透aloha的版本,再去研究31楼的。毕竟aloha的版本感觉思路跟我的有相似之处,好理解一些。

TOP

回复 58# aloha20200628


    老大。你的delims那边的有点问题,害我找了好久。
就是那个中英文空格你给打了三个。直接卡当了。修改为一个制表符和一个空格就OK了
像我这边,还加入全角符的空格,也完美支持了。标点符号也完美显示。
大赞哦~!

TOP

返回列表