找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
楼主: batman

【练习-050】批处理超越for命令tokens极限分割字符串

[复制链接]
发表于 2009-8-13 09:56:00 | 显示全部楼层
昏...我的思路和BATMAN一样的...居然没想到用for的1*....
发表于 2009-8-14 21:22:54 | 显示全部楼层

回复 12楼 的帖子

第一个跑后面是因为你的代码有个小错误,显示结果只不过是乱打正着。批处理预处理的时候你的f定义"set f=%f:+=&echo %" 被解释为“set f=d_q 973 & echo c_j 314........”所以你的显示结果其实是从这一句就开始了,而不是最后一个命令%f%。最后一个%f%其实显示的就是第一节。
整个代码如果要完美应该改成
  1. @echo off
  2. set /p f=<1.txt
  3. set f=%f:-=+%
  4. set f=%f:+=^&echo %
  5. echo %f%
  6. pause
复制代码
这样的话&可以在最后一个echo的时候经过预处理解释成连接符,而不会在第三句的时候就被解释成连接符。

评分

参与人数 3PB +11 技术 +1 收起 理由
120268323 + 1 谢谢老师详细分析
rat + 6
基拉freedom + 5 谢谢帮我解决了O(∩_∩)O~

查看全部评分

发表于 2009-8-14 21:24:46 | 显示全部楼层

回复 15楼 的帖子

我首先想到的就是这个方法,以前替换文本中的等号=的时候用过。呵呵,看样子出差三天论坛上我错过了不少好戏啊……
发表于 2009-8-18 17:56:33 | 显示全部楼层

把+-替换成回车

  1. @echo off & setlocal
  2. set s=d_q 973-c_j 314+y_d 356+i_p 638-u_m 204+w_a 588+j_c 829-p_t 599+j_v 803-p_y 92-r_h 677+h_i 341+h_q 705-r_f 601-m_s 822+q_q 17-w_y 720+s_d 325-d_n 559-l_s 109+l_v 160-x_b 232-u_r 282-v_l 521+p_o 403-x_n 613+t_x 185-g_v 678+z_n 753+j_k 779-o_f 283-h_w 390-z_o 772-w_v 252-a_e 51-m_t 945-k_q 444-r_m 233-p_w 744+k_k 136-w_k 131-s_o 163+k_i 733+w_c 733+g_l 42+o_i 515+x_h 130-n_b 200+i_u 25+z_i 730
  3. set s=%s:+=-%
  4. setlocal enabledelayedexpansion
  5. set s=!s:-=^

  6. !
  7. echo !s!
  8. endlocal
  9. pause>nul
复制代码

评分

参与人数 3PB +45 收起 理由
Lumiere + 10 大开眼界
netbenton + 20 以前就有一个回车替换的问题,这个可好了! ...
pusofalse + 15 学习了

查看全部评分

发表于 2009-8-19 15:21:36 | 显示全部楼层

  1. @echo off
  2. set s=d_q 973-c_j 314+y_d 356+i_p 638-u_m 204+w_a 588+j_c 829-p_t 599+j_v 803-p_y 92-r_h
  3. 677+h_i 341+h_q 705-r_f 601-m_s 822+q_q 17-w_y 720+s_d 325-d_n 559-l_s 109+l_v 160-x_b 232-
  4. u_r 282-v_l 521+p_o 403-x_n 613+t_x 185-g_v 678+z_n 753+j_k 779-o_f 283-h_w 390-z_o 772-w_v
  5. 252-a_e 51-m_t 945-k_q 444-r_m 233-p_w 744+k_k 136-w_k 131-s_o 163+k_i 733+w_c 733+g_l
  6. 42+o_i 515+x_h 130-n_b 200+i_u 25+z_i 730
  7. set s=%s:+=-%
  8. set "s=echo %s:-=&echo;%"
  9. %s%
  10. pause
复制代码
发表于 2012-4-9 05:39:56 | 显示全部楼层
本帖最后由 lt5 于 2012-4-11 05:10 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. set "f=d_q 973-c_j 314+y_d 356+i_p 638-u_m 204+w_a 588+j_c 829-p_t 599+j_v 803-p_y 92-r_h 677+h_i 341+h_q 705-r_f 601-m_s 822+q_q17-w_y 720+s_d 325-d_n 559-l_s 109+l_v 160-x_b 232-u_r 282-v_l 521+p_o 403-x_n 613+t_x 185-g_v678+z_n 753+j_k 779-o_f 283-h_w 390-z_o 772-w_v 252-a_e 51-m_t 945-k_q 444-r_m 233-p_w 744+k_k 136-w_k 131-s_o 163+k_i 733+w_c 733+g_l 42+o_i 515+x_h 130-n_b 200+i_u 25+z_i 730"
  3. set str=%f:+=-%
  4. set i=^


  5. for %%a in ("!i!") do (
  6.    for /f "delims=" %%b in ("!str:-=%%~a!") do echo %%b
  7. )
  8. pause>nul
复制代码
上面的代码看似复杂,其实思路很简单,就是把分隔符替换成换行符,就像word一样。只用set的话无法把所有结果输入到文本文件,因为set默认是只取最后一行。
还有下面的虽然用了很多set,但为了能输入到文本里不得不用for循环,有没有不用for循环也能把结果输入到文本呢?
  1. @echo off&setlocal enabledelayedexpansion
  2. set "str=d_q 973-c_j 314+y_d 356+i_p 638-u_m 204+w_a 588+j_c 829-p_t 599+j_v 803-p_y 92-r_h 677+h_i 341+h_q 705-r_f 601-m_s 822+q_q17-w_y 720+s_d 325-d_n 559-l_s 109+l_v 160-x_b 232-u_r 282-v_l 521+p_o 403-x_n 613+t_x 185-g_v678+z_n 753+j_k 779-o_f 283-h_w 390-z_o 772-w_v 252-a_e 51-m_t 945-k_q 444-r_m 233-p_w 744+k_k 136-w_k 131-s_o 163+k_i 733+w_c 733+g_l 42+o_i 515+x_h 130-n_b 200+i_u 25+z_i 730"

  3. set str=%str: =#%
  4. set str=%str:+= %
  5. set str=%str:-=;%
  6. for %%i in (%str%) do (set a=%%i
  7. echo !a:#= !)
  8. pause>nul
复制代码
发表于 2012-4-12 12:19:26 | 显示全部楼层
本帖最后由 lt5 于 2012-4-12 12:26 编辑
  1. @echo off
  2. set "f=d_q 973-c_j 314+y_d 356+i_p 638-u_m 204+w_a 588+j_c 829-p_t 599+j_v 803-p_y 92-r_h 677+h_i 341+h_q 705-r_f 601-m_s 822+q_q17-w_y 720+s_d 325-d_n 559-l_s 109+l_v 160-x_b 232-u_r 282-v_l 521+p_o 403-x_n 613+t_x 185-g_v678+z_n 753+j_k 779-o_f 283-h_w 390-z_o 772-w_v 252-a_e 51-m_t 945-k_q 444-r_m 233-p_w 744+k_k 136-w_k 131-s_o 163+k_i 733+w_c 733+g_l 42+o_i 515+x_h 130-n_b 200+i_u 25+z_i 730"
  3. set f=+%f:-=+%
  4. set f=%f:+=>>test.x &echo %
  5. type test.x
  6. pause
复制代码
感觉还是batman的方法通用一些,后来的方法都是找到了这段文字的规律而已,所以代码显得很简洁。若是遇到其他文字这个方法可能就没用了
发表于 2012-8-31 16:51:24 | 显示全部楼层
新手学习。。。收到!
发表于 2012-8-31 18:13:33 | 显示全部楼层
都是高手,我来学习的。
发表于 2012-9-14 20:30:21 | 显示全部楼层
回复 15# batman

  1. set "str=d_q 973-c_j 314+y_d 356+i_p 638-u_m 204+w_a 588+j_c 829-p_t 599+j_v 803-p_y 92-r_h 677+h_i 341+h_q 705-r_f 601-m_s 822+q_q17-w_y 720+s_d 325-d_n 559-l_s 109+l_v 160-x_b 232-u_r 282-v_l 521+p_o 403-x_n 613+t_x 185-g_v678+z_n 753+j_k 779-o_f 283-h_w 390-z_o 772-w_v 252-a_e 51-m_t 945-k_q 444-r_m 233-p_w 744+k_k 136-w_k 131-s_o 163+k_i 733+w_c 733+g_l 42+o_i 515+x_h 130-n_b 200+i_u 25+z_i 730"


  2.    
复制代码
刚才试了一下  好像这段不加引号也是可以的,加了和不加到底有什么区别啊? 求指教!!!
发表于 2012-10-17 11:38:00 | 显示全部楼层
谁有我简洁 连for也省了..............
不过爆出一个我想不通的问题 问什么第一个会到最后去呢??
保存那 ...
基拉freedom 发表于 2009-8-12 22:23



    为什么第一个会到最后一个去, 是因为第一个的前面没有+-符号,你用符号替换的时候. 第一个自然就 不会被处理了.所以.你就在最后加上了.echo %f%.

   解决的方法就是在 在行首位置添加一个+-符号..
发表于 2020-12-23 11:32:32 | 显示全部楼层
厉害啊 谢谢分享了
发表于 2021-11-16 09:33:13 | 显示全部楼层
出题出的好,答题答的妙!!!
发表于 2024-12-22 16:45:09 | 显示全部楼层
回复 12# 基拉freedom
  1.   @echo off&setlocal EnableDelayedExpansion
  2.   set token=
  3.   set "f=0\1\2\3\4\5\6\7\8\9\a^^^^^^^^a%%TEMP%%^^|^^&^^>^^|^^^^^!temp^^^^^!"
  4.   set "f=!f:\=&set token=!"
  5.   set "f=set token=!f!"
  6.   %f%
  7.   set token
  8.   ::取最后一个token(使用 !f! 不会求值;%f%: 对于特殊字符,要多重转义)
  9.   ::Output: token=a^a%TEMP%|&>|!temp!
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 19:16 , Processed in 0.021398 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表