Board logo

标题: for命令截取指定字符 [打印本页]

作者: maker0321     时间: 2007-11-14 23:03    标题: for命令截取指定字符

现在遇到一个难题,希望大家能帮忙解决!先谢过各位高手!做成bat文件

现有一个文件lar.txt里面记录了一些文件名。
例如:
e:\web\abc.com\asdfasdf.mdb
e:\web\bdccv.com\asdfas.mdb
……
……
现在想要1、提取这个lar.txt文件中第二个“\”和第三个“\”中的字符串。将提取出来的这些字符串作为一个变量。2、并在d盘下创建这些变量的文件夹。例如d:\abc.com、d:\bdccv.com这些文件夹;3、将lar.txt中的这些文件拷贝到这些相对应的文件夹中。
请高手帮帮忙,一方面因为工作总要做这种工作,不想再手工弄了。另一方面也在学习dos的for命令。如果真能实现,请帮忙在程序中注明解释。小弟也能提高自己的水平,向高手靠近。给与帮忙小弟一定会加分!!
作者: lxmxn     时间: 2007-11-14 23:11
最终目的是copy这些文件到对应的文件夹中去,一定要设置这些字符串为变量么?
作者: fastslz     时间: 2007-11-14 23:21

@echo off
for /f "tokens=2,3 delims=\" %%i in (lar.txt) do call :slz %%j
pause
:slz
set xxx=%1
if not defined xxx goto:eof
md "D:\%1" 2>nul
copy /y lar.txt "D:\%1\"
goto:eof

作者: fastslz     时间: 2007-11-14 23:23

作者: lxmxn     时间: 2007-11-14 23:24
呵呵,fastslz 误解了楼主的意思了吧?
@echo off&Setlocal EnableDelayedExpansion

for /f "delims=" %%a in (lar.txt) do (
    for /f "delims=\ tokens=3" %%b in ("%%a") do (
        echo md "D:\%%b" 2>nul
        echo copy "%%a" "D:\%%b\"
    )
)

作者: fastslz     时间: 2007-11-14 23:39
哦是的忽略了他要拷贝原文件
@echo off
for /f "delims=" %%a in (lar.txt) do (
        for /f "tokens=2,3 delims=\" %%i in ("%%a") do call :slz %%j %%a
)
pause
:slz
set xxx=%1
if not defined xxx goto:eof
md "D:\%1" 2>nul
copy /y "%2" "D:\%1\"
goto:eof
楼主自己选择吧一个启用变量延迟,一用call,2种都理解了“一石二鸟”

和lxmxn版主有一共同点比较强盗md "D:\%1" 2>nul省去if not exist
作者: maker0321     时间: 2007-11-15 10:03
版主的命令还有些问题。例如lar.txt文件内容如下:
"F:\win2003sp1\vmware.log"  
"F:\win2003sp1\xxx\vmware.log"  

命令不仅会建立xxx文件夹,还会建立vmware.log文件夹(这是不需要的),请帮忙再测试。还有就是我有些看不懂版主的命令。可否在for命令处做些解释,不胜感激。
fastslz的命令实在是看不懂,没有测试。不好意思,但是我会给你加分。再次感谢。
作者: fastslz     时间: 2007-11-15 12:12
还看不懂?

  Quote:
Originally posted by maker0321 at 2007-11-14 23:03:
现在想要1、提取这个lar.txt文件中第二个“\”和第三个“\”中的字符串。

"tokens=2,3 delims=\"按你的思路第二个“\”和第三个“\”写的,否则我不必这样写,这样写会出来一个%%j就比较难理解了。
作者: maker0321     时间: 2007-11-15 12:53
@echo off
for /f "delims=" %%a in (lar.txt)【把lar.txt文件中的每一行的内容作为%%a的内容】 do (
        for /f "tokens=2,3 delims=\" %%i in ("%%a")【把%%a中的第二个/和第三个/中的内容作为值传递给谁了??】 do call :slz  %%j【%%j的值是什么?】 %%a
)
pause
:slz
set xxx=%1【%1的值什么??】
if not defined【no defined是什么意思??】 xxx goto:eof【程序中没有:eof】
md "D:\%1" 2>nul
copy /y "%2"【%2又是什么??】 "D:\%1\"
goto:eof

这是对fastslz大哥程序不明白的地方,对不起我是新手,刚刚来这里学习的。很多地方都是很明白,真心希望能得到大家的帮助。请不要嫌弃我白痴。谢谢各位。
作者: fastslz     时间: 2007-11-15 13:51
@echo off
for /f "delims=" %%a in (lar.txt)【把lar.txt文件中的每一行的内容作为%%a的内容】 do (
        for /f "tokens=2,3 delims=\" %%i in ("%%a")【把%%a中的第二个/和第三个/中的内容作为值传递给了%%j】 do call :slz  %%j这里换成%%i就是第1个/和第2个/中的内容 %%a
)
pause

:slz
'【到这里上面的%%j变成了%1,%%a变成了%2,为什么要用call呢是为了处理完每个%%a】
set xxx=%1设置一个xxx变量
if not defined xxx goto:eof【如果没有定义xxx跳回for本身】也就是处理完最后1个%%a跳回for本身,如果没有xxx变量和这一句,P也能运行只是最后会显示1个未定义操作,起到修饰作用
md "D:\%1" 2>nul
copy /y "%2" "D:\%1\"
goto:eof【处理完1个%%a后跳回for本身】

[ Last edited by fastslz on 2007-11-15 at 01:54 PM ]
作者: maker0321     时间: 2007-11-15 14:45
YES!!终于明白了fastslz你的意思了。衷心谢谢!金牌果真不是浪得虚名!佩服佩服!
作者: jianxiao     时间: 2007-11-18 16:17
请问在纯dos下有没有具有这样的功能的命令呢?
for /f 在纯dos下是不行的