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

批处理用 for 截取变量中的倒数第二段字符

新手晋级练习题 2

set var=av sdkjf   dfj  sdjf   abc efg
注: 变量 var 的值是不确定的.
要求: 用一个 for  
显示结果:  abc
即:显示变量var的倒数第二段字符.

作用: 加深对 for 工作流程的理解.

[ 本帖最后由 随风 于 2008-1-4 13:32 编辑 ]
技术问题请到论坛发帖求助!

回复 38# Batcher

代码正常运行无误。

是先前偷懒将多段代码放在同一个批次测试却疏于检查错漏,
在此向版主致歉。

TOP

回复 37# kingjames


跑不通的具体表现是什么呢,得到的结果不对?还是有啥报错信息?

如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

代码内容,设置的颜色为white(即:白色)防止答案轻易泄露
显示方法 1:按住鼠标左键,框住代码即可。
显示 ...
随风 发表于 2008-1-7 21:58



   
    @echo off
    set a=sd sdfs sdf sdfsdfa sdfasd abc sdf1
    call :lis "%a%"
    pause
    :lis
    for /f "tokens=1,2*" %%a in ("%~1") do (
      if "%%c"=="" (echo %%a) else call :lis "%%b %%c"
    )
    goto :eof

这段我始终跑不通

我加了自己的理解后才可以

@echo off
set a="sd sdfs sdf sdfsdfa sdfasd abc sdf1"
:000
call :lis %a%
pause
:lis
for /f "tokens=1,2,*" %%a in (%1) do (

  if "%%c"=="" (echo %%a) else set a="%%b %%c"& goto :000
)
exit /b

我有那些部分理解错误,请指点于我,谢谢!

TOP

真的受益匪浅!!

今天晚上终于把这题的回复看完了,学习到很多东西!!特别是了解到shift 和%%~ni, %%~xi 等内容!对以后应该很有帮助的

TOP

看了各位的思路很受启发。特别是随风版主的shift 和 梦想种子的 %%~ni, %%~xi 给我留下很深的印像。效率都很高。
下面我给一段新的思路,字符串越长,倒数列越小,效率越好。(不考虑特殊符号)
  1. @echo off&setlocal enabledelayedexpansion
  2. set "var=av sdkjf dfj sdjf afsd wry av sdkjf dfj sdjf abc wry"
  3. set "str="
  4. for /l %%i in (1,1,8189) do (
  5. set v=!var:~-%%i,1!
  6. if "!v!"==" " set/a n+=1&if !n! equ 2 echo !str!&pause&goto :eof
  7. if !n! geq 1 set str=!var:~-%%i,1!!str!
  8. )
复制代码

[ 本帖最后由 inittab 于 2009-5-1 09:57 编辑 ]

TOP

跑题L  ....

[ 本帖最后由 lxzzr 于 2009-5-1 09:17 编辑 ]

TOP

我来学习了

看到题目,自己动手去操作了,结果也出来,可是看看到batman后,我还是晚来一步了!我的思路是跟batman大哥一样的!!的确论坛里藏龙卧虎的!向各位大虾学习。
  1. @echo off&setlocal enabledelayedexpansion
  2. set var=av sdkjf   dfj  sdjf   abc efg
  3. for %%a in (%var%) do (set/a m+=1&set !m!=%%a)
  4. set/a m-=1
  5. echo !%m%!
复制代码

TOP

  1. @echo off
  2. set /p var1=请输入字符串:
  3. set n=0
  4. set var=%var1% #
  5. :begin
  6. set /a n+=1
  7. set /a m=%n%+2
  8. for /f "tokens=%n%,%m%" %%i in ("%var%") do (
  9. if "%%j"=="#" (echo %%i)  else (goto begin))
  10. pause
复制代码
通过给字符串末尾加个#来判断实现

TOP

多谢batman 的提示,没有看清题意。不过你写的变量str的值是固定的,不能随意输入。
(*^_^*)

TOP

楼上的思路是正确的,但应注意到题目要求是一个for,我也来做一下吧:
  1. rem 试用于截取倒数任何一段
  2. @echo off
  3. set "str=aa bb cc dd ee ff gg hh"
  4. for %%a in (%str%) do set /a n+=1&call,set _%%n%%=%%a
  5. set /p num=请输入要倒数截取的段数(请注意应小于总段数加1):
  6. set /a num-=1,n-=num
  7. call,echo 截取的字符为:%%_%n%%%&pause>nul
复制代码
***共同提高***

TOP

输入任意字符串:
  1. @echo off
  2. set /p str=请输入字符串(形如:ee dd   dd  sf abc ed):
  3. for %%i in (%str%) do set /a n+=1
  4. set /a n-=1
  5. for /f "tokens=%n%" %%i in ("%str%") do echo %%i
  6. pause
复制代码
(*^_^*)

TOP

楼上的是代码只能针对字符串只有5段的情况,其它段数则不符合了,呵呵。

TOP

@echo off
set var=av sdkjf   dfj  sdjf   abc efg
for /f "tokens=5 delims= " %i in ("%var%") do echo %i
这个即可解决

TOP

牙慧

foxjl很聪明啊!但有点不明白为什么call set b=%%i %%b%% 会使字符串倒序啊!
既然var的值不确定貌似下面用set /p 更合题意啊! 呵呵...拾君牙慧,请多指教
@echo off
set /p a=
for %%i in (%a%) do (call set b=%%i %%b%%)
for /f "tokens=2" %%i in ("%b%") do echo %%i
pause
像山岳一样静默,如烈火一般燃烧!!!

TOP

返回列表