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


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

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

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

TOP

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

TOP

回复 38# aloha20200628


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

TOP

回复 38# aloha20200628


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

TOP

本帖最后由 newswan 于 2024-7-21 20:05 编辑

回复 42# 娜美

#36 #37 输出正确
输出到屏幕正确,保存到文件也应该正确,文件不能对齐,是因为编辑器的字体问题

TOP

回复 40# buyiyang


对,由于 awk 使用环境不同,有的地方是 + 有的地方是 -

TOP

有的虽然解决了在cmd屏幕里对齐,  但输出到文本但输出到文本又是另一个不对齐现象发生了
娜美 发表于 2024-7-21 17:30

先看看我20楼和30楼说的字体问题……

TOP

本帖最后由 娜美 于 2024-7-21 17:40 编辑

我带着好奇心, 跟着这个贴题测过上面你们所说的解决方案,  都没有通过以下文本测试,   有的虽然解决了在cmd屏幕里对齐,  但输出到文本又是另一个不对齐现象发生了
测试要对齐文本 a.txt
  1. aa          1232    米
  2. bbbbb     66       米
  3. b 66  米
  4. cccccccccccccccccccccccccccccccccccc    c   cccccccccccccccccccccccccccccc  cc   c          米 c
  5. c cc    ccc     v          米
  6. 补补补补补补补补补补补补补补补补补  cccccccccccccccccccccccccccccc          补补补补补补补补补补补补补补补补补       c       c                 c
  7. 补  c                      cccccccccccccccccccccccccccccc    c             c                c
复制代码
Out.txt  请复制到txt文本中观看才能看到对齐大概样式
对齐后, 输出到文本中它们大概至少应该是这样的吧,  但是都相差甚远呢,  到目前为止还没有解决输出到文本对齐问题
  1. aa                                                          1232                                                   米
  2. bbbbb                                                    66                                                      米
  3. b                                                            66                                                      米
  4. cccccccccccccccccccccccccccccccccccc    c                                                        cccccccccccccccccccccccccccccc             cc            c                米 c
  5. c                                                            cc                                                       ccc                                                        v             米
  6. 补补补补补补补补补补补补补补补补补       cccccccccccccccccccccccccccccc          补补补补补补补补补补补补补补补补补       c             c                 c
  7. 补                                                          c                                                         cccccccccccccccccccccccccccccc             c             c                 c
复制代码

TOP

回复 35# aloha20200628


    使用这段代码如果字段中有=,等批处理分隔符的话会被错误分割;而且以“全文最大字段长度”为标准,当原文件字段长度差距悬殊时会使结果中字符较少的列视觉间隔过大而不协调。

TOP

回复 36# newswan


    第35行应该是maxWidth - LenHZ

TOP

回复 38# aloha20200628

多谢,这次真学到了。

TOP

本帖最后由 aloha20200628 于 2024-7-21 15:59 编辑

回复 1# shenlong

跑完35层楼,总算能踏踏实实给楼主一个用批处拿下本帖(最长混合字段可自定义,列数可自定义)的解决方案了...

TOP

本帖最后由 newswan 于 2024-7-21 19:56 编辑

支持全角字符
format-table.ps1 "in.txt" "out.txt"
  1. param(
  2. [String]$filenameIn ,
  3. [String]$filenameOut
  4. )
  5. $file = Get-Content -Path $filenameIn -Encoding UTF8
  6. $maxWidth = @{}
  7. $file | ForEach-Object {
  8. $arr = $_  -split "\s+"
  9. for ( $i = 0 ; $i -lt $arr.count ; $i++ ){
  10. $Width = ($arr[$i]).length + ( $arr[$i] -replace "[\x00-\x7F]","" ).length
  11. if ( $maxWidth[$i] -lt $Width ) {
  12. $maxWidth[$i] = $Width
  13. }
  14. }
  15. }
  16. $strTable = [System.Collections.ArrayList]@()
  17. $file | ForEach-Object {
  18. $arr = $_  -split "\s+"
  19. $str = ""
  20. for ( $i = 0 ; $i -lt $arr.count ; $i++ ){
  21. $LenHZ = ( $arr[$i] -replace "[\x00-\x7F]","" ).length
  22. $str += ($arr[$i]).PadRight( $maxWidth[$i] - $LenHZ , " " ) + ":"
  23. }
  24. [void]$strTable.add( $str ) #$str -replace "\s$",""
  25. }
  26. $strTable | Out-File -Encoding 'UTF8' -FilePath $filenameOut
复制代码

TOP

返回列表