Board logo

标题: [文件操作] 批处理怎样移动文件到第一层文件夹? [打印本页]

作者: comicguests    时间: 2012-6-27 19:48     标题: 批处理怎样移动文件到第一层文件夹?

本帖最后由 comicguests 于 2012-6-27 15:13 编辑

下面的代码能移动文件到根目录,但我想移动到第一层文件夹...应该如何修改呢?
感谢关注!!
  1. @echo off
  2. echo 移动文件中...
  3. for /f "delims=" %%i in ('dir *.* /a-d /s /b') do (
  4.     if not "%%~dpi"=="%~dp0" call :movefile "%%i"
  5. )
  6. echo 移动文件完成!
  7. exit
  8. :movefile
  9. if exist "%~dp0%~nx1" set "n="&goto renfile
  10. move %1 "%~dp0">nul 2>nul||(attrib -r -h -s %1& move %1 "%~dp0">nul)
  11. goto :eof
  12. :renfile
  13. set/a n+=1
  14. if exist "%~dp0%~n1(%n%)%~x1" goto renfile
  15. move %1 "%~dp0%~n1(%n%)%~x1">nul 2>nul||(
  16. attrib -r -h -s %1& move %1 "%~dp0%~n1(%n%)%~x1">nul)
  17. goto :eof
复制代码
嗯,1楼所言甚是,那么,将e:\a\b\c\*里的文件,全移到e:\a里(包含b、c中全部文件)
作者: forfiles    时间: 2012-6-27 22:04

能否给出移动前和移动后的目录结构分布是什么样子的?就用tree /f命令就行了
作者: apang    时间: 2012-6-27 22:32

顶楼P并不仅仅是移动文件到"根目录"的。

按楼主现在的要求,P放到e:\a目录下运行,不需要改。。。
作者: CrLf    时间: 2012-6-27 23:22

一般可以这样:
  1. for /r "e:\a\b\c\" in (*) do move /y "%%a" "e:\a\"
复制代码
或者试试地图炮:
  1. for /r "e:\a\b\c\" in (.) do move /y "%%a\*.*" "e:\a\"
复制代码

作者: comicguests    时间: 2012-6-28 17:29

回复 3# apang


    嗯,这点没错,但我要处理的并不光是a文件夹,还有aa、aaa...
作者: comicguests    时间: 2012-6-28 17:33

回复 4# CrLf


    感谢指教,可a、b、c只是举例子,因为文件夹时常变换(下载文件夹,总有不少包含很多子文件夹的文件夹,所以名称不固定),所以不能指定绝对路径...
作者: FOR    时间: 2012-6-28 18:11

本帖最后由 FOR 于 2012-6-29 21:14 编辑

遇同名文件跳过
  1. @echo off
  2. for /f "delims=" %%I in ('dir/b/s/a-d') do (
  3. for /f "tokens=1,2* delims=\" %%a in ("%%~dpI") do (
  4. if not "%%c"=="" (
  5. if not exist "%%a\%%b\%%~nxI" move "%%I" "%%a\%%b"
  6. )
  7. )
  8. )
  9. pause
复制代码

作者: Batcher    时间: 2012-6-28 18:22

回复 6# comicguests


    文字描述不清,请用tree /f给出目录结构
作者: comicguests    时间: 2012-6-29 16:32

回复 7# FOR


    感谢回复,但一闪而过...我是win7旗舰32位...
作者: comicguests    时间: 2012-6-29 16:35

回复 8# Batcher


    语文学的不是很好,见谅...
大概是e:\*\*\*,将后两个*里的内容移动到e:\*里
作者: Batcher    时间: 2012-6-29 17:19

回复 10# comicguests


    你是不知道如何使用tree /f命令?还是不愿意用?
作者: FOR    时间: 2012-6-29 21:13

回复 9# comicguests

笔误,漏写了一个 % 号
  1. @echo off
  2. for /f "delims=" %%I in ('dir/b/s/a-d') do (
  3.         for /f "tokens=1,2* delims=\" %%a in ("%%~dpI") do (
  4.                 if not "%%c"=="" (
  5.                         if not exist "%%a\%%b\%%~nxI" move "%%I" "%%a\%%b"
  6.                 )
  7.         )
  8. )
  9. pause
复制代码

作者: comicguests    时间: 2012-6-30 13:27

回复 11# Batcher


    惭愧,我连菜鸟都算不上...十分抱歉
作者: comicguests    时间: 2012-6-30 13:35

回复 12# FOR

感谢,的确是按照我的想法执行的!!
可运行之后才发现,我的想法有个漏洞,我的下载文件夹为F:\download\,当我在F:\download中运行批处理后,F:\download中子文件夹里的内容都移到F:\download里了...
可不可以把批处理所在文件夹当做第一文件夹,
第一文件夹(批处理所在)\第二文件夹\第三文件夹\...
将第三文件夹里的全部内容移到第二文件夹中?
思维出现这么大漏洞真是对不起....
作者: forfiles    时间: 2012-6-30 16:23

回复 13# comicguests


比如,你要查看C:\test的目录结构:
开始
运行
cmd
tree /f "C:\test"
作者: comicguests    时间: 2012-6-30 18:49

回复 15# forfiles


    试了一下,原来是这样,感谢!!
作者: FOR    时间: 2012-6-30 19:53

本帖最后由 FOR 于 2012-7-3 01:43 编辑
  1. @echo off
  2. for /f "delims=" %%i in ('dir/b/s/a-d') do (
  3. set "str=%%i"
  4. setlocal enabledelayedexpansion
  5. set "str=!str:*%cd%=!"
  6. for /f "tokens=1 delims=\" %%a in ("!str!") do (
  7. if not "%%i"=="!cd!\%%~nxi" move "%%i" "!cd!\%%a"
  8. )
  9. endlocal
  10. )
  11. pause
复制代码

作者: comicguests    时间: 2012-7-2 20:54

回复 17# FOR
  1. 移动了         1 个文件。
  2. 移动了         1 个文件。
  3. 移动了         1 个文件。
  4. 移动了         1 个文件。
  5. 移动了         1 个文件。
  6. 移动了         1 个文件。
  7. 移动了         1 个文件。
  8. 移动了         1 个文件。
  9. 移动了         1 个文件。
  10. 移动了         1 个文件。
  11. 移动了         1 个文件。
  12. 请按任意键继续. . .
复制代码
运行后显示以上内容,但文件实际未移动...
但感谢帮助!!
作者: FOR    时间: 2012-7-3 01:42

多打了个括弧,你那里没提示“以达到最大递归层”吗?
  1. @echo off
  2. for /f "delims=" %%i in ('dir/b/s/a-d') do (
  3.         set "str=%%i"
  4.         setlocal enabledelayedexpansion
  5.         set "str=!str:*%cd%=!"
  6.         for /f "tokens=1 delims=\" %%a in ("!str!") do (
  7.                 if not "%%i"=="!cd!\%%~nxi"  move "%%i" "!cd!\%%a"
  8.         )
  9.         endlocal
  10. )
  11. pause
复制代码

作者: comicguests    时间: 2012-7-3 12:19

回复 19# FOR


   没有,试了一下,还是不行...
作者: powerbat    时间: 2012-7-3 12:36

回复 13# comicguests


无语,没见过这么执拗的人。
作者: powerbat    时间: 2012-7-3 13:38

  1. @echo off
  2. for /f "delims=" %%i in ('dir /a-d/b/s') do move "%%a"
  3. pause
复制代码

作者: FOR    时间: 2012-7-3 22:08

19楼代码我实际测试是成功的。
作者: FOR    时间: 2012-7-3 22:19

再试试这个
  1. @echo off&set /a n=1
  2. call :Loop "%cd%"
  3. :loop
  4. for /f "tokens=1* delims=\" %%i in ("%~1") do (
  5. set /a n+=1
  6. if not "%%j"=="" call :Loop "%%j"
  7. )
  8. for /f "delims=" %%I in ('dir/b/s/a-d') do (
  9. for /f "tokens=%n%* delims=\" %%a in ("%%I") do (
  10. if not "%%b"=="" move "%%I" "%cd%\%%a"
  11. )
  12. )
  13. pause
复制代码

作者: comicguests    时间: 2012-7-4 10:28

回复 22# powerbat
  1. 系统找不到指定的文件。
  2. 系统找不到指定的文件。
  3. 系统找不到指定的文件。
  4. 系统找不到指定的文件。
  5. 系统找不到指定的文件。
  6. 系统找不到指定的文件。
  7. 系统找不到指定的文件。
  8. 系统找不到指定的文件。
  9. 系统找不到指定的文件。
  10. 系统找不到指定的文件。
  11. 系统找不到指定的文件。
  12. 系统找不到指定的文件。
  13. 系统找不到指定的文件。
  14. 系统找不到指定的文件。
  15. 系统找不到指定的文件。
  16. 请按任意键继续. . .
复制代码
汇报结果!
执拗么...我倒是感觉自己性格不好...
作者: comicguests    时间: 2012-7-4 10:32

回复 24# FOR


    多次劳烦您,真是十分感谢,但还是只显示移动,但没有移动...是我系统问题么?
win732位旗舰版
ps:实在不行就只能放弃了...
作者: FOR    时间: 2012-7-4 12:51

本帖最后由 FOR 于 2012-7-4 12:53 编辑

我也是 win7 32位旗舰版
19、24楼的代码我这里都能成功
12楼的代码能正常运行,怎么24楼的就会不行呢??
作者: comicguests    时间: 2012-7-5 11:45

所以我就怀疑是不是系统的个别差异...




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