标题: [文件操作] 多级目录下的目录按要求加深,如何用批处 理实现? [打印本页]
作者: kmustwxw 时间: 2015-1-7 11:52 标题: 多级目录下的目录按要求加深,如何用批处 理实现?
本帖最后由 kmustwxw 于 2015-1-7 11:58 编辑
现有大量文件夹要处理,问题描述如下:我用目录树来描述我的问题,要处理的目录结构为:
005
├─005001
│ ├─JA00001
│ │ ├─用处1
│ │ ├─用处2
│ │ ├─用处3
│ │ └─用处4
│ ├─JA00002
│ │ ├─用处1
│ │ ├─用处2
│ │ ├─用处3
│ │ └─用处4
│ ├─JA00003
│ │ ├─用处1
│ │ ├─用处2
│ │ ├─用处3
│ │ └─用处4
还有好多这样的文件夹,能说明问题就不列了,要达到的效果为:
005
├─005001
│ │
│ ├─JA00001
│ │ └─JA00001
│ │ ├─用处1
│ │ ├─用处2
│ │ ├─用处3
│ │ └─用处4
│ ├─JA00002
│ │ └─JA00002
│ │ ├─用处1
│ │ ├─用处2
│ │ ├─用处3
│ │ └─用处4
│ ├─JA00003
│ │ └─JA00003
│ │ ├─用处1
│ │ ├─用处2
│ │ ├─用处3
│ │ └─用处4
就是要在 最里面的目录 的上级目录 加一级目录,
1、按上面的要求,代码如何实现?
2、在 要达到的效果 的目录树中的红色的目录名,如何统一改为:“文件表格” 。这个要求代码如何实现?
说明:005文件夹,是我任意选的一个,还有许多和005一样文件夹结构的文件夹,比如 :001 002 003 004 006 等等。不知道我的表述是不是清楚?,先谢谢了。
补充说明:第一个要求用一段代码实现,第二个要求用另一段代码实现,两个是各自独立的,不要一段代码实现两个功能。谢谢。有空的兄弟帮忙看下。
作者: pcl_test 时间: 2015-1-7 13:39
本帖最后由 pcl_test 于 2015-1-7 13:44 编辑
回复 1# kmustwxw
假设005所在目录为E:\test
一、- @echo off
- set "lj=E:\test"
- for /f "delims=" %%a in ('dir /ad/b "%lj%\"') do (
- for /f "delims=" %%b in ('dir /ad/b "%lj%\%%a\"') do (
- for /f "delims=" %%c in ('dir /ad/b "%lj%\%%a\%%b\"') do (
- md "%lj%\%%a\%%b\%%ctemp\"
- move "%lj%\%%a\%%b\%%c" "%lj%\%%a\%%b\%%ctemp\"
- ren "%lj%\%%a\%%b\%%ctemp\" "%%c"
- )
- )
- )
- pause
复制代码
二、- @echo off
- set "lj=E:\test"
- for /f "delims=" %%a in ('dir /ad/b "%lj%\"') do (
- for /f "delims=" %%b in ('dir /ad/b "%lj%\%%a\"') do (
- for /f "delims=" %%c in ('dir /ad/b "%lj%\%%a\%%b\"') do (
- for /f "delims=" %%d in ('dir /ad/b "%lj%\%%a\%%b\%%c\"') do (
- ren "%lj%\%%a\%%b\%%c\%%d\" "文件表格"
- )
- )
- )
- )
- pause
复制代码
作者: apang 时间: 2015-1-7 15:15
1.- @set @n=0;/* & echo off
- pushd "D:\Test\"
- set J=cscript -nologo -e:jscript "%~0"
- for /f "delims=" %%a in ('dir /ad/b/s ^| %J%') do (
- for %%b in ("%%a..") do (
- md "%%a..\%%~nxb"
- move "%%a." "%%a..\%%~nxb\"
- )
- ) 2>nul
- pause & exit/b & rem */
-
- s = WScript.StdIn.ReadAll();
- ar = s.replace(/\r\n/g, "\\$&").split("\r\n");
- ar.sort();
- for (i=ar.length; i--;) {
- if (ar[i].indexOf(ar[i-1]) >= 0) ar.splice(i-1, 1);
- }
- WScript.Echo(ar.join("\n"))
复制代码
2.- @set @n=0;/* & echo off
- pushd "D:\Test\"
- set J=cscript -nologo -e:jscript "%~0"
- for /f "delims=" %%a in ('dir /ad/b/s ^| %J%') do (
- md "%%a..\文件表格"
- move "%%a." "%%a..\文件表格\"
- ) 2>nul
- pause & exit/b & rem */
-
- s = WScript.StdIn.ReadAll();
- ar = s.replace(/\r\n/g, "\\$&").split("\r\n");
- ar.sort();
- for (i=ar.length; i--;) {
- if (ar[i].indexOf(ar[i-1]) >= 0) ar.splice(i-1, 1);
- }
- WScript.Echo(ar.join("\n"))
复制代码
作者: apang 时间: 2015-1-8 11:18
假设 005 文件夹位于 D:\Test目录下,在 005 文件夹的第三层下面创建新文件夹:- @echo off
- set "sPath=D:\Test"
- set "re=%sPath:\=\\%\\[^\\]*\\[^\\]*\\[^\\]*"
- pushd "%sPath%\"
- for /f "delims=" %%a in ('dir /ad/b/s^|findstr /irx "%re%"') do (
- pushd "%%a\"
- md "%%~nxa" 2>nul
- for /f "delims=" %%b in ('dir /ad /b') do (
- if /i "%%b" NEQ "%%~nxa" (
- move "%%b" "%%~nxa\"
- )
- )
- popd
- )
- pause
复制代码
作者: kmustwxw 时间: 2015-1-8 11:40
回复 4# apang 首先感谢大家无私的帮助,谢谢你们!
apang你后面写的代码能完美解决问题,精简!(前面的也能)有部分看的不太懂,虚心向你们学习,能帮我rem一下这段的意思吗? set "re=%sPath:\=\\%\\[^\\]*\\[^\\]*\\[^\\]*" 我看过你写的好多代码都会先用 set 在开头设置一段,就是我水平有限,看不懂,真心希望解释下。谢谢。
作者: apang 时间: 2015-1-8 16:31
回复 5# kmustwxw
斜杠(\)字符在findstr正则表达式中属于特殊字符,起转义其它字符的作用,要匹配“\”本身,需要用“\\”表示
[^\\] 表示非“\”字符的集合
[^\\]* 表示任意个数的非“\”字符
\\[^\\]* 一个路径字符,后面跟任意个数的非路径字符,刚好可以匹配一级目录
以下用4种颜色对比匹配项,应该可以明白:
%sPath:\=\\%\\[^\\]*\\[^\\]*\\[^\\]*
匹配的路径字串 D:\test\005\005001\JA00001
加上表示限定的参数 /irx 后,能匹配005目录下面的第3层,多于或少于3层将匹配不到。
作者: kmustwxw 时间: 2015-1-9 09:24
回复 6# apang 讲解的很详细,完全彻底的明白了,你用颜色表达的这个,让人一目了然,能把复杂的东西说的简单,深入浅出的讲解问题,也是一种特别好的能力。谢谢 。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |