Board logo

标题: [文件操作] [已解决]批处理怎样批量移动文件? [打印本页]

作者: lxh623    时间: 2011-11-1 23:06     标题: [已解决]批处理怎样批量移动文件?

本帖最后由 lxh623 于 2011-11-14 21:10 编辑

我的E盘有个文件夹JP-XIN,下面有很多pdf和txt文件。提取名称到文本a。
E盘根目录有两个文件“文件夹名称1.txt”(一个英文单词),“文件夹名称2.txt”(二个英文单词),包括我的一些文件夹的名字,一行一个文件夹名。反正在E盘,应该可以不包括路径吧?!

第一个批处理、只要JP-XIN的文件名称含有“文件夹名称1.txt”的“一个英文单词”,就移动文件到该文件夹。(用“文件夹名称1.txt”的每一行去搜索文本a。)
第二个批处理、只要JP-XIN的文件名称含有“文件夹名称2.txt”的“两个英文单词”(无顺序和间隔的要求),就移动文件到该文件夹。(用“文件夹名称2.txt”的每一行的两个单词去搜索文本a。)

谢谢您的帮助!

文件夹名称1.txt:(部分)
defoam
spandex

文件夹名称2.txt:(部分)
flame polycarbonate
Die attach
epoxy resin

文件名:
TW200743656--flame retardant halogen-free polycarbonate compositions with high reflectance
US6699929-=die attach adhesives with vinyl ether and carbamate or urea functionality
作者: awk    时间: 2011-11-1 23:26

没明白,举个例子把。
作者: 小胖狐狸    时间: 2011-11-2 16:11

呵呵,如果只是临时处理一下,很容易解决
直接用Windows系统的搜索功能就可以,搜索、全选、剪切、粘贴
即使是必须同时包含两个单词,只需要在粘贴后,再次重复上一步即可

当然,如果是为了研究批处理的话,这是个不错的课题 :)
可以参考置顶帖
[系列教程]批处理for语句从入门到精通[20101225更新]
http://www.bathome.net/thread-2189-1-1.html
使用其中的 for /f
作者: weichenxiehou    时间: 2011-11-2 22:03

回复 1# lxh623
到底是“移动”还是“拷贝”?理解没错的话应该是“拷贝”吧,就拿第一个批处理来说,一个文件名中可能含有多个文件夹的名称,如果是移动的话,到底移动到哪个文件夹呢?
作者: lxh623    时间: 2011-11-2 23:00

回复  lxh623
到底是“移动”还是“拷贝”?理解没错的话应该是“拷贝”吧,就拿第一个批处理来说,一个文 ...
weichenxiehou 发表于 2011-11-2 22:03

谢谢!
是“移动”。
移动的话,后面的就不考虑了。
作者: awk    时间: 2011-11-2 23:41

文件夹defoam是在E:\下面,还是在E:\JP-XIN\下面?
作者: lxh623    时间: 2011-11-3 00:08

本帖最后由 lxh623 于 2011-11-3 17:43 编辑
文件夹defoam是在E:\下面,还是在E:\JP-XIN\下面?
awk 发表于 2011-11-2 23:41

谢谢您!
文件夹defoam是在E:\下面。
一般是第三级、四级、五级目录。
或者可以“文件夹名称1.txt”以及“文件夹名称2.txt”里面带路径。(用最后一个“\”后面的字符搜索文本a。)
或者列出E盘所有文件夹路径tmp.txt。用“文件夹名称1.txt”以及“文件夹名称2.txt”的每一行去提取,得到文本c(过渡一下)。
作者: lxh623    时间: 2011-11-5 23:04

我自己学习一晚上,得到代码,不正确。请高手指正修改:
  1. @echo off
  2. for /f "delims=  tokens=1" %%i in (文件夹名称2.txt)
  3. for /f "delims=  tokens=2" %%j in (文件夹名称2.txt)  do
  4. (
  5.     for /f "delims=*" %%k in ('dir /s/b/a-d E:\JP-XIN\*.pdf E:\JP-XIN\*.txt  ^| findstr /i "%%i"^|findstr /i "%%j"')
  6.     (for /f "delims=" %%l in ('dir /s/b/a:d-h E:\ ^|findstr /i "%%i"^|findstr /i "%%j"'>nul') do (
  7.        if not "%%l"=="" move "%%k" "%%~dpl" >nul 2>nul
  8. )))
  9. pause
复制代码

作者: lxh623    时间: 2011-11-8 07:17

本帖最后由 lxh623 于 2011-11-9 23:51 编辑

担心第一句是错的。第一个do前面是错的。
下面这样子也有问题,为什么?空格作为分隔符,怎样表示?用“*”,可以吗?
没有明确出现"%%j",先出现“%%k”,合适吗?
%%k得到是带有路径的文件名,对不对?
  1. @echo off
  2. for /f "delims=  tokens=1,2" %%i in (b2.txt) do (
  3.   for /f "delims=" %%k in ('dir /s/b/a-d E:\JP-WKA\*.pdf E:\JP-WKA\*.txt  ^|    findstr /i "%%i"^|findstr /i "%%j"') do (
  4.     for /f "delims=" %%l in ('dir /s/b/a:d-h E:\ ^| findstr /i "%%i"^|findstr /i "%%j"  2^>nul') do (
  5.       if not "%%l"=="" move "%%k" "%%~dpl" >nul 2>nul
  6. )))
  7. pause
复制代码
开始部分可不可以这样:(它后面又能用什么连接词,连接到“ for /f "delims=" %%k in ('dir /s/b/a-d E:\JP-WKA\*”?)
  1. for /f "delims=  tokens=1,2" %%i in (b2.txt) do (echo %%i %%j
复制代码

作者: lxh623    时间: 2011-11-11 14:54

怎样把下面两个复合到一起?怎样使得后面的代码能够用到"%%i"、“%%j”?
谢谢!
  1. @echo off
  2. for /f "usebackq tokens=1,2 delims= " %%i in ("文件夹名称2.txt")
  3. do(echo %%i %%j)
复制代码
  1. for /f "delims=" %%k in ('dir /s/b/a-d E:\JP-WKA\*.pdf E:\JP-WKA\*.txt  ^| findstr /i "%%i"^|findstr /i "%%j"') do (
  2.      for /f "delims=" %%l in ('dir /s/b/a:d-h E:\ ^| findstr /i "%%i"^|findstr /i "%%j"  2^>nul') do (
  3.        if not "%%l"=="" move "%%k" "%%~dpl" >nul 2>nul
  4. ))
  5. pause
复制代码

作者: lxh623    时间: 2011-11-11 21:01

为什么想要这么个批处理?
因为下载了文献题录,每年更新部分就有上万条。我想,先建立了空白txt,然后,自动整理,就可以节约大量时间。
作者: CrLf    时间: 2011-11-11 22:25

不太明白,举个例子,比如有个文件叫作 batch.pdf,是可以与 bat 这个关键词匹配呢?还是只能按 batch 这个完整的单词来看呢?
作者: lxh623    时间: 2011-11-11 23:40

不太明白,举个例子,比如有个文件叫作 batch.pdf,是可以与 bat 这个关键词匹配呢?还是只能按 batch 这个 ...
CrLf 发表于 2011-11-11 22:25

拜托大侠!
我想事先的文件夹名称会考虑周到一点。
我想的是,只要含有,就移动。不考虑精确匹配。比如,batchly,batchlise都移动到batch。
作者: CrLf    时间: 2011-11-12 00:33

  1. @echo off&setlocal enabledelayedexpansion
  2. cd e:\JP-XIN
  3. for /f %%a in (e:\文件夹名称1.txt) do if exist *%%a*.* md %%a&move *%%a*.* %%a\
  4. for /f "tokens=1,2" %%a in (e:\文件夹名称2.txt) do (
  5.    for %%c in (*%%a*.*) do (
  6.       set filename=%%c
  7.       if "!filename:%%b=!" neq "!filename!" md "%%a %%b"&move "%%c" "%%a %%b\"
  8.    )
  9. )
复制代码

作者: lxh623    时间: 2011-11-12 13:14

本帖最后由 lxh623 于 2011-11-12 22:14 编辑
CrLf 发表于 2011-11-12 00:33

谢谢您!
怎么在原文件夹建立文件夹,而且移动到那里。
我想的是,E盘有这么个文件夹,移动到那里。
查找文件:
for /f "delims=" %%k in ('dir /s/b/a-d E:\JP-WKA\*.pdf E:\JP-WKA\*.txt  ^| findstr /i "%%i"^|findstr /i "%%j"')
查找目录:
for /f "delims=" %%l in ('dir /s/b/a:d-h E:\ ^| findstr /i "%%i"^|findstr /i "%%j"  2^>nul')
我按照您的,做成下面这样子,不运行:
  1. @echo off&setlocal enabledelayedexpansion
  2. cd e:\JP-WKA
  3. for /f "tokens=1,2" %%a in (e:\文件夹名称2.txt) do (
  4.       for %%c in (*%%a*.*) do (
  5.          set filename=%%c
  6.          if "!filename:%%b=!" neq "!filename!" do (
  7.             for /f "delims=" %%l in ('dir /s/b/a:d-h E:\ ^| findstr /i "%%a"^|findstr /i "%%b"  2^>nul') & move "%%c" "%%~dpl" >nul 2>nul
  8. )))
  9. pause
复制代码

作者: lxh623    时间: 2011-11-13 23:52

本帖最后由 lxh623 于 2011-11-13 23:55 编辑
CrLf 发表于 2011-11-12 00:33

学习了延迟变量,修改了我自己那个。可以移动,但是移动到该文件夹的母文件夹。不知道哪里有问题?麻烦帮我看看。
另外,“!filename:%%b=!” 这段是什么含意,在哪里查得到,哪本书上?
谢谢您们!
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. for /f "tokens=1,2 delims= " %%i in (文件夹名称2.txt) do (
  4.       set var1=%%i & set var2=%%j
  5.       for /f "delims=" %%k in ('dir /s/b/a-d E:\JP-WKA\*.pdf E:\JP-WKA\*.txt  ^|    findstr /i "!var1!"^|findstr /i "!var2!"') do (
  6.          for /f "delims=" %%l in ('dir /s/b/a:d-h E:\ ^| findstr /i "!var1!"^|findstr /i "!var2!"  2^>nul') do (
  7.             if not "%%l"=="" move "%%k" "%%~dpl" >nul 2>nul
  8. )))
  9. pause
复制代码

作者: lxh623    时间: 2011-11-14 16:20

本帖最后由 lxh623 于 2011-11-14 16:22 编辑

回复 16# lxh623
上面这个,我换成"%%~fsl",基本解决了,尽管不知道道理。
又想到我的文本象下面,怎样把每一行当成一个单词去搜索。
首先,怎样echo含有空格的每一行。
谢谢您!
文件夹名称1.txt:(示例)
antenna
liq crystal
liquid crystal




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