Board logo

标题: 批处理用 for 截取变量中的倒数第二段字符 [打印本页]

作者: 随风    时间: 2008-1-3 23:45     标题: 批处理用 for 截取变量中的倒数第二段字符

新手晋级练习题 2

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

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

[ 本帖最后由 随风 于 2008-1-4 13:32 编辑 ]
作者: myweb9169    时间: 2008-1-4 13:12     标题: 交作业

  1. @echo off
  2. set var="av sdkjf   dfj  sdjf   abc efg"
  3. for /f "tokens=5 delims= " %%i in (%var%) do echo %%i
  4. pause
复制代码
菜鸟就的练,已经试过,能显示abc,有个建议,希望各位老大和高手,对我们的代码点评一下,有利菜鸟进步。
作者: ieutk    时间: 2008-1-4 13:26

楼上代码可是可以!
那如果变量的值是这样的var="av sdkjf   dfj  sdjf   da fea abc efg"呢
那结果就是da了.可能随风兄没有说明白吧!
作者: 随风    时间: 2008-1-4 13:29

不错,
变量var的段数是不确定的.
作者: ieutk    时间: 2008-1-4 13:39

变量var中abc这一段前面的段数是不确定的,有可能是五段,有可能是三段

所以2楼不是正确答案,各位继续!
作者: 随风    时间: 2008-1-4 15:31

原帖由 myweb9169 于 2008-1-4 13:12 发表
@echo off
set var="av sdkjf   dfj  sdjf   abc efg"
for /f "tokens=5 delims= " %%i in (%var%) do echo %%i
pause菜鸟就的练,已经试过,能显示abc,有个建议,希望各位老大和高手,对我们的代码点评一下,有 ...


虽不是最佳答案,但也不错了,怪我的题目不清楚.
给点建议:
  空格为for默认的分割符,所以在字符窜中没有其它默认分割符的时候,可以省略delims=  这一句.
作者: foxJL    时间: 2008-1-4 15:44

用了一个SET.
  1. @echo off
  2. set a=sd sdfs sdf sdfsdfa sdfasd 123 sdf1
  3. for %%i in (%a%) do (call set b=%%i %%b%%)
  4. for /f "tokens=2" %%i in ("%b%") do echo %%i
  5. pause
复制代码

作者: myweb9169    时间: 2008-1-4 16:03

谢谢几位老大鼓励,是我没看懂题目要求,安原题要求是不会作的,
楼上老大,你好像用了2个for了,呵呵,不过用set b=%%i %%b%%)
能把字符串倒排序,学到了,但不明白怎么回事
作者: 随风    时间: 2008-1-4 16:09     标题: 回复 9# 的帖子

慢慢来,搞懂了for的流程就会明白了.
作者: 随风    时间: 2008-1-7 20:15

没人回答了么?
老鸟们出马吧!
看谁的代码最简洁?
建议:将你们的代码用白色字体显示,这样新手们若想自己写代码,就可以不受你们的代码的影响


具体使用方法如下:
  将以下所有的()换成[]即可;

(color=red)代码内容,设置的颜色为white,防止答案轻易泄露(/color)(color=blue)
显示方法 1:按住鼠标左键,框住代码即可。
显示方法 2:点击代码右上角的“复制内容到剪贴板”也可。
(/color)(color=white)(code)
此处写代码
此处写代码
此处写代码
此处写代码
此处写代码
(/code)(/color)
(color=red)高亮(反选)显示代码(/color)

[ 本帖最后由 随风 于 2008-1-7 20:22 编辑 ]
作者: 随风    时间: 2008-1-7 21:11

代码内容,设置的颜色为white,防止答案轻易泄露
显示方法 1:按住鼠标左键,框住代码即可。
显示方法 2:点击代码右上角的“复制内容到剪贴板”也可。
  1. @echo off
  2. set var=av sdkjf   dfj  sdjf   abc efg
  3. for %%i in (%var%) do (
  4.    call set num=%%str%%
  5.    set str=%%i
  6. )
  7. echo %num%
  8. pause
复制代码

高亮(反选)显示代码

[ 本帖最后由 随风 于 2008-1-7 21:13 编辑 ]
作者: foxJL    时间: 2008-1-7 21:53



  1. @echo off
  2. set a=sd sdfs sdf sdfsdfa sdfasd 123 sdf1
  3. for %%i in (%a%) do (call set a=%%i %%a%%)
  4. call :a %a%
  5. :a
  6. echo.%2
  7. pause
复制代码


[ 本帖最后由 foxJL 于 2008-1-7 21:56 编辑 ]
作者: 随风    时间: 2008-1-7 21:58     标题: 回复 12# 的帖子

代码内容,设置的颜色为white(即:白色)防止答案轻易泄露
显示方法 1:按住鼠标左键,框住代码即可。
显示方法 2:点击代码右上角的“复制内容到剪贴板”也可。


不错,不错,真是一山还有一山高,借鉴foxjl的思路,再来两个,不用for用shift

  1. @echo off
  2. set a=sd sdfs sdf sdfsdfa sdfasd abc sdf1
  3. call :lis %a%
  4. pause
  5. :lis
  6. if "%3"=="" echo %1&goto :eof
  7. shift /1
  8. goto lis
复制代码


不用set也可以。

  1. @echo off
  2. set a=sd sdfs sdf sdfsdfa sdfasd abc sdf1
  3. call :lis "%a%"
  4. pause
  5. :lis
  6. for /f "tokens=1,2*" %%a in ("%~1") do (
  7.   if "%%c"=="" (echo %%a) else call :lis "%%b %%c"
  8. )
  9. goto :eof
复制代码

高亮(反选)显示代码

[ 本帖最后由 随风 于 2008-1-7 22:20 编辑 ]
作者: 553850000    时间: 2008-3-29 21:48

@echo off
set a="av sdkjf dfj sdjf abc efg"
for /f "tokens=5 delims= " %%i in (%a%) do @echo %%i
pause
作者: foxJL    时间: 2008-3-29 21:58

楼上兄弟的代码跟二楼是一样的.
作者: 梦想种子    时间: 2008-3-29 23:17

  1. @echo off
  2. set var=av sdkjf   dfj  sdjf df abc efg
  3. set var=%var: =.%
  4. for %%i in (%var%) do set "var=%%~ni"
  5. for %%i in (%var%) do set "var=%%~xi"
  6. echo %var:.=%
  7. pause
复制代码

或者
  1. @echo off
  2. set var=av sdkjf   dfj  sdjf df abc efg
  3. set var=%var: =.%
  4. call :get %var% 0
  5. call :get %var% 1
  6. echo %var:.=%
  7. pause
  8. exit
  9. :get
  10. if %2 == 0 (set var=%~n1) else set var=%~x1
复制代码

[ 本帖最后由 梦想种子 于 2008-3-29 23:27 编辑 ]
作者: easyguy    时间: 2008-4-6 15:14

@echo off
set var=av sdkjf   dfj  sdjf df abc efg
set var=%var: =.%
for %%i in (%var%) do set "var=%%~ni"
for %%i in (%var%) do set "var=%%~xi"
echo %var:.=%
pause

能不能给我解释下%%~ni和%%~xi什么意思?
作者: 梦想种子    时间: 2008-4-6 18:12

%%~ni 得到文件名
%%~xi 得到后缀名

1、av sdkjf   dfj  sdjf df abc efg (初始值)
2、av.sdkjf...dfj..sdjf.df.abc.efg (把空格换成点)
3、av.sdkjf...dfj..sdjf.df.abc (获得文件名)
4、.abc (获得后缀名)
5、abc (去掉前面的点)
作者: 梦想种子    时间: 2008-4-27 14:45

  1. @echo off
  2. set var=av sdkjf   dfj  sdjf df abc efg
  3. for %%i in (%var%) do call :rev %%i
  4. set /a c-=1
  5. call echo %%#%c%%%
  6. pause
  7. exit
  8. :rev
  9. set /a c+=1
  10. set #%c%=%1
复制代码
这样对么?
作者: xiaoxx    时间: 2008-4-27 18:02

@echo off
set var=av sdkjf stdf asby  dfj  sdjf   abc efg
set str="test"
setlocal EnableDelayedExpansion
for %%i in (%var%) do (
   set last=!str!
   set str=%%i
)
echo !last!嘿嘿
pause

想法是用2个变量,str始终存储当前%%i,last存储%%i的前一个.
学习中,那个call没看懂,有高手给解释下吗?
作者: BatHome    时间: 2008-4-27 18:11

以上的代码类 随风的

call在这里的用途类似 延迟
作者: fu417674    时间: 2008-5-6 15:18

那如果是要倒数第三四段呢?
因为我照各位的方法能达到要求,但我自己对倒数第三~以后的没有办法,
请各位好心回答我一下,我是刚学的就想到论坛来请各位带进门!
作者: fu417674    时间: 2008-5-6 18:27

截取倒数第三段
@echo off
set var=af df aa dfdg adfd  df dgg
for %%i in (%var%) do (call call set d=%%b%%
call set b=%%e%%
set e=%%i)
echo %d%
pause
请帮忙看看

[ 本帖最后由 fu417674 于 2008-5-6 18:29 编辑 ]
作者: bater    时间: 2008-9-13 22:06     标题: 菜鸟点评

[code]@echo off
set a=sd sdfs sdf sdfsdfa sdfasd abc sdf1
call :lis %a%
pause
:lis
if "%3"=="" echo %1&goto :eof
shift /1
goto lis
这个题目各位高手都能给出正确结果,就菜鸟的接受能力,和解题思路来讲,应该是随风版主,上面的这段代码,是本题目的最佳答案! 
虽然其他版主的也很简洁,但就解决问题,除了技术和思路来说。越浅显易懂,越是对我等菜鸟有帮助!

[ 本帖最后由 bater 于 2008-9-13 22:11 编辑 ]
作者: wxcute    时间: 2008-9-14 21:25

  1. @echo off
  2. set var=av sdkjf   dfj  sdjf df     abc    efg
  3. set var=%var: =.%
  4. call :xx %var%
  5. call :x %var%
  6. pause>nul
  7. :xx
  8. set var=%~n1
  9. goto :eof
  10. :x
  11. echo%~x1
复制代码
我的代码用for有点勉强,参考[ 梦想种子]
  1. @echo off
  2. set var=av sdkjf   dfj  sdjf df     abc    efg
  3. set var=%var: =.%
  4. for %%i in (%var%) do set "var=%%~ni"
  5. call :x %var%
  6. pause>nul
  7. goto :eof
  8. :x
  9. echo%~x1
复制代码

作者: snowwolfii    时间: 2008-9-21 21:29     标题: 牙慧

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
作者: sihui11    时间: 2008-10-23 17:19

@echo off
set var=av sdkjf   dfj  sdjf   abc efg
for /f "tokens=5 delims= " %i in ("%var%") do echo %i
这个即可解决
作者: youxi01    时间: 2008-10-23 19:56

楼上的是代码只能针对字符串只有5段的情况,其它段数则不符合了,呵呵。
作者: keen    时间: 2009-4-2 23:51

输入任意字符串:
  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
复制代码

作者: batman    时间: 2009-4-3 00:09

楼上的思路是正确的,但应注意到题目要求是一个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
复制代码

作者: keen    时间: 2009-4-3 17:15

多谢batman 的提示,没有看清题意。不过你写的变量str的值是固定的,不能随意输入。
作者: cainiao736    时间: 2009-4-4 16:15

  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
复制代码
通过给字符串末尾加个#来判断实现
作者: sjzong    时间: 2009-5-1 00:59     标题: 我来学习了

看到题目,自己动手去操作了,结果也出来,可是看看到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%!
复制代码

作者: lxzzr    时间: 2009-5-1 08:45

跑题L  ....

[ 本帖最后由 lxzzr 于 2009-5-1 09:17 编辑 ]
作者: inittab    时间: 2009-5-1 09:50

看了各位的思路很受启发。特别是随风版主的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 编辑 ]
作者: sjzong    时间: 2009-5-2 00:08     标题: 真的受益匪浅!!

今天晚上终于把这题的回复看完了,学习到很多东西!!特别是了解到shift 和%%~ni, %%~xi 等内容!对以后应该很有帮助的
作者: kingjames    时间: 2023-6-26 10:47

代码内容,设置的颜色为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

我有那些部分理解错误,请指点于我,谢谢!
作者: Batcher    时间: 2023-6-26 10:54

回复 37# kingjames


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

如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
作者: kingjames    时间: 2023-6-26 12:34

回复 38# Batcher

代码正常运行无误。

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




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2