Board logo

标题: [文件操作] [已解决]移动文件的批处理有什么问题? [打印本页]

作者: lxh623    时间: 2011-11-23 23:30     标题: [已解决]移动文件的批处理有什么问题?

本帖最后由 lxh623 于 2011-11-29 15:44 编辑

我自己做了批处理,用了几天,今天发现有问题。
批处理在这里,http://www.bathome.net/thread-14568-2-1.html
http://www.bathome.net/thread-14686-1-1.html
路径:
E:\涂料-防腐蚀\corrosion proof
E:\涂料-防腐蚀\▲防锈\rust proof
E:\涂料-防水剂\water-proof
E:\涂料-防水剂\waterproof
E:\涂料-防水剂\B防雾\fog-proof
E:\涂料-防水剂\H皮革\leather water proof
E:\涂料-防水剂\G玻璃\waterproof glass
E:\涂料-防水剂\E混凝土\water proof concrete,mortar,cement
E:\涂料-防水剂\H织物\water proof fabric,textile
E:\涂料-防水剂\H织物\water proof fibre,fiber,fibrous
E:\涂料-防水剂\E石膏\water proof gypsum,plaster
E:\涂料-防水剂\F陶瓷\ceramic water proof
文件夹名称1:
fog-proof
waterproof
water-proof
我设想按照“文件夹名称1.txt”每行内容,精确移动到相应文件夹。但是,怎么把下面这些文件移动到了“E:\涂料-防腐蚀\corrosion proof”?
AU9941499-=aqueous silane emulsion for damp-roofing building materials-RP
AU2009251100-=weather-proof sealing arrangement for use in switching cabinet
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. for /f "delims=" %%a in (文件夹名称1.txt) do (
  4.       set VAR=%%a
  5.          for /f "delims=" %%k in ('dir /s/b/a-d E:\JP-XIN\*.pdf E:\JP-XIN\*.txt  ^| findstr /i /c:"!VAR!"') do (
  6.             for /f "delims=" %%l in ('dir /s/b/a:d-h E:\ ^| findstr /i /c:"!VAR!"') do (
  7.                if not "%%l"=="" move "%%k" "%%~fsl"
  8. )))
  9. pause
复制代码
感谢您的帮助!
作者: awk    时间: 2011-11-23 23:51

AU9941499-=aqueous silane emulsion for damp-roofing building materials-RP
AU2009251100-=weather-proof sealing arrangement for use in switching cabinet

是因为这些特殊字符串吧
作者: lxh623    时间: 2011-11-24 07:46

本帖最后由 lxh623 于 2011-11-24 09:50 编辑

回复 2# awk
“文件夹名称1”是每行一个到三个英文单词,单词间是空格或者“-”。像这种,我想首先提取每一行作为搜索字串。
用下面的代码试验,结果正常。但是,移动文件还是不行。
问题在于,proof不是一行,应该提取搜索词出现故障。
参考:http://www.bathome.net/viewthread.php?tid=4274
  1. @echo off
  2. for /f "delims=*" %%a in (文件夹名称1.txt) do (
  3.       echo %%a>>b.txt)
  4. pause
复制代码

作者: lxh623    时间: 2011-11-24 21:55

诸位大虾,我真的着急死了!
感谢!
作者: awk    时间: 2011-11-24 23:23

回复 3# lxh623


proof不是一行,这是什么意思?
作者: lxh623    时间: 2011-11-25 07:25

回复  lxh623


proof不是一行,这是什么意思?
awk 发表于 2011-11-24 23:23

文件夹名称1:
fog-proof
waterproof
water-proof
作者: yyykkkyyyy    时间: 2011-11-25 10:51

回复 4# lxh623

似乎不是很复杂的问题,被你描述得乱得很,不然早解决了。还不知我是否理解到要怎么弄。
简单地把要搜索的范围表为一处(如E:\涂料-防腐蚀)下的各级文件夹
“相应的文件夹”也放一处
  1. @echo off
  2. set sd=E:\涂料-防腐蚀
  3. set dd=E:\相应目标文件夹
  4. set df=E:\文件夹名.txt
  5. set xn=*.pdf *.txt
  6. for /f "usebackq delims=" %%a in ("%df%")do (
  7.    md "%dd%\%%a" 2>nul
  8.    for /f "delims=" %%b in ('dir/b/s/ad "%dd%\*%%a*"')do (
  9.       echo  ==^> %%b
  10.       for %%c in (%xn%)do move "%%b\%%c" "%dd%\%%a\"
  11.    )
  12. )
  13. pause
复制代码

作者: lxh623    时间: 2011-11-25 14:43

回复 7# yyykkkyyyy
谢谢您!

原文件在E:\JP-XIN,下面搜索的是文件名。
for /f "delims=" %%k in ('dir /s/b/a-d E:\JP-XIN\*.pdf E:\JP-XIN\*.txt  ^| findstr /i /c:"!VAR!"')
文件夹散布各处,下面得到的是文件夹路径。文件夹不动,只移动文件。
for /f "delims=" %%l in ('dir /s/b/a:d-h E:\ ^| findstr /i /c:"!VAR!"')
作者: yyykkkyyyy    时间: 2011-11-25 15:35

本帖最后由 yyykkkyyyy 于 2011-11-25 15:36 编辑

回复 8# lxh623


    哦,你是说在文件名而不是文件夹名里找“关键字”,符合的移到对应文件夹去...
  1. @echo off
  2. set sd=E:\JP-XIN
  3. set dd=E:\相应目标文件夹
  4. set df=E:\文件夹名.txt
  5. set sf="%sd%\*%%a*.pdf" "%sd%\*%%a*.txt"
  6. for /f "usebackq delims=" %%a in ("%df%")do (
  7.    md "%dd%\%%a" 2>nul
  8.    for /f "delims=" %%b in ('dir/b/s/a-d %sf%')do (
  9.       echo %%b ==^> %dd%\%%a
  10.       move "%%b" "%dd%\%%a\"
  11.    )
  12. )
  13. pause
复制代码

作者: lxh623    时间: 2011-11-25 20:31

本帖最后由 lxh623 于 2011-11-25 20:44 编辑
回复  lxh623


    哦,你是说在文件名而不是文件夹名里找“关键字”,符合的移到对应文件夹去...
yyykkkyyyy 发表于 2011-11-25 15:35

好像需要创建文件夹。
我的原意,是有这么个文件夹(唯一),搜索到文件,并移动到该文件夹。
文件夹的名称至少包括文本1.txt某一行(比如,“anti-foamer,antifoamer”)。
文本1.txt:
transfer print
anti-foamer
insect
fibre reinforced plastic
用文本1的每一行去搜索文件以及文件夹。
作者: lxh623    时间: 2011-11-25 20:58

回复 10# lxh623
有个设想,可惜不知道怎样实现。
if exixt var3 ,ifnot exist var3 & if exist var2,ifnot  exist var3 & ifnot exist var2。
或者再分拆文本1为三个。一个词的、两个词的、三个词的。
作者: yyykkkyyyy    时间: 2011-11-26 10:59

本帖最后由 yyykkkyyyy 于 2011-11-26 11:08 编辑

回复 11# lxh623


    楼主描述能力不佳,这看10楼说的,显然还没完全解决问题,说实话我还没理解想作什么,唯有楼主自己学会批处理才方便,那一个词几个词的要把findstr 命令学好才行,我这把顶楼代码改一下,本想尽量少动原码的,实在是不划算——原来为什么有误?因为找文件时是会带路径的,把文件夹名含要找的“关键字”的文件也算相符了,想还用findstr 的话,这个“正则式”会很复杂,还是不用findstr的好,如果还是不合意,请另想他法不宜在此老追问补充情况
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. for /f "delims=" %%a in (文件夹名称1.txt)do (
  4.    for /f "delims=" %%b in ('dir/s/b/ad "e:\*%%a*"')do (
  5.    for /f "delims=" %%c in ('dir/s/b/a-d "E:\JP-XIN\*%%a*.pdf" "E:\JP-XIN\*%%a*.txt"')do (
  6.      move "%%c" "%%b\" 2>nul
  7. )))
  8. pause
复制代码

作者: lxh623    时间: 2011-11-26 15:37

回复 9# yyykkkyyyy
谢谢您!
我说得不清楚,您也看得比较正确了。
真的还是不对,我也在想办法。
到现在错误的原因在于,文本出来的变量带有空格和“-”,从而,路经以及文件名称带有这两个东西。怎样设置变量?
因此,刚才我把第一句加上usebackq,仍然不对。(for /f "usebackq delims=")
曾经想避开变量(如下),也不行。
  1. @echo off
  2. for /f "delims=" %%k in ('dir /s/b/a-d E:\JP-XIN\*.pdf E:\JP-XIN\*.txt ^| findstr /r /g:文件夹名称1.txt') do (
  3.          for /f "delims=" %%l in ('dir /s/b/a:d-h E:\ ^| findstr /r /g:文件夹名称1.txt') do (
  4.             if not "%%l"=="" move "%%k" "%%~fsl"
  5. ))
  6. pause
复制代码

作者: lxh623    时间: 2011-11-27 15:49

回复 13# lxh623
还想到一个办法。文本4列入:
anti-foamer
anti foamer
water-proof
water proof
然后把E盘所有含有这些词的文件名称中的词语修改为复合词,比如,antifoamer,waterproof。
之后,就可以按照一个词的批处理移动,这个我自己就会编出来。
作者: lxh623    时间: 2011-11-29 15:43

找到问题了。
文本里面有个roof形成干扰。
  1. @echo off
  2. for /f "tokens=* delims=" %%a in (文件夹名称1.txt) do (
  3.     set VAR=%%a
  4.     setlocal ENABLEDELAYEDEXPANSION
  5.     for /f "delims=" %%k in ('dir /s/b/a-d E:\JP-XIN\*.pdf E:\JP-XIN\*.txt  ^| findstr /i /c:"!VAR!"  2^>nul') do (
  6.         for /f "tokens=*" %%l in ('dir /s/b/a:d-h E:\ ^| findstr /e /c:"!VAR!"  2^>nul') do (
  7.             if not "%%l"=="" move "%%k" "%%l\"  >nul 2>nul
  8. )))
  9. pause
复制代码





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