求批处理命令解决多层文件夹嵌套的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求批处理命令解决多层文件夹嵌套的问题相关的知识,希望对你有一定的参考价值。

文件夹层层嵌套,模式是这样的:
a01夹中有子文件夹b01,b02,b03…
b01子文件夹中有子文件夹c01,c02,c03…
b02子文件夹中有子文件夹d01,d02,d03…
b03子文件夹中有子文件夹e01,e02,e03…

a02夹中有子文件夹b01,b02,b03…
b01子文件夹中有子文件夹c01,c02,c03…
b02子文件夹中有子文件夹d01,d02,d03…
b03子文件夹中有子文件夹e01,e02,e03…

a03夹中有子文件夹b01,b02,b03…
b01子文件夹中有子文件夹c01,c02,c03…
b02子文件夹中有子文件夹d01,d02,d03…
b03子文件夹中有子文件夹e01,e02,e03…

以此类推。。。
最底层文件夹里有文件,中间层文件夹内没有文件,只有下一级文件夹。(另:文件夹的位数不一定三位,可能一位两位或者四位五位。)
要求指定路径后,输出的结果摆脱文件夹嵌套,形成同一级文件夹,文件夹中内容不变,格式要求是这样的:
a01-b01-c01。。。。

最好先弄个测试文件夹以免搞错
批处理文件放要处理的总文件夹,会把所有该层以下各子层含有文件的文件夹改为带上所属中间层文件夹名移到批处理文件并列位置,然后删去空文件夹(实际是删去所有子文件夹) 我认为这样很好,如实在要指定一文件夹,把第二行前的::去掉并修改等号后内容

@echo off&setlocal enabledelayedexpansion
::set "np=e:\xx\xxx"
if not defined np set "np=%~dp0"
if "%np:~-1%"=="\" set np=%np:~,-1%
cd/d "%~dp0"
set "fnp=%np:\=\\%"
for /f "delims=" %%a in ('dir/s/b/ad^|findstr /ixv "%fnp%"^|sort/r')do (
rd "%%a" 2>nul&&echo 删除 %%a||(
set "s=%%~a"
set "ns=!s:%~dp0=!"
set "ns=!ns:\=-!"
ren "%%~a" "!ns!"
move "%%~dpa!ns!" "%np%"
echo %%~dpa!ns! =^>%np%))
pause追问

超棒,测试成功!不过执行第二行命令“set "np=e:\xx\xxx"时,数据结果有误,丢失最后一个文件夹。
能否再帮忙写一个反向程序,即将同一目录下a01-b01-c01这样格式的大量文件夹,处理成多层嵌套,结果如原始问题中的嵌套模式?
如能帮忙,将再追加100分。如果不能,也会将本回答选为最佳答案,谢谢!

追答

@echo off
cd/d "%~dp0"
for /f "delims=" %%a in ('dir/b/ad *-*')do (
echo %%a
set "s=%%a"
setlocal enabledelayedexpansion
set "s=!s:-=" "!"
for %%b in ("!s!")do (
if not exist %%b md %%b
cd %%b)
move "%~p0%%a\*.*">nul
cd "%~p0"
rd/q "%%a"
endlocal)
pause

参考技术A 哪个,看的有点思维混乱。。。
是否只要弄成
a01-b01-c01

a02-b01-c01

a03-b01-c01

文件放在c01里,别的文件夹删除?
(另:文件夹的位数不一定三位,可能一位两位或者四位五位。)什么意思?追问

结果输出到指定文件夹中,而不是保留在原文件夹里,a01-b01-c01为文件夹名称,里面保留原c01的内容。所有中层文件夹均删除。

文件夹位数不一定三位a01,可能是两位a1,或者五位a0001。

参考技术B 是你没说清楚还是我没看明白,总之想帮你有点力不从心。追问

就是把最底层的文件夹全部分离出来,放在同一级目录下面,因为最底层文件夹名称相同,直接复制出来,会被相互覆盖,所以用短线连接,将上面几层文件夹名称接i起来,合成类似a01-b01-c01样式的文件夹。这样就不会出现被覆盖的情况了。这样每一个新文件夹,都包含上面几层文件夹的信息,也会分类清晰。

require或include相对路径多层嵌套引发的问题

 

require或include相对路径多层嵌套引发的问题

 
php中require/include 包含相对路径的解决办法
在PHP中require,include一个文件时,大都是用相对路径,是个很头疼的问题。
 
例如:
(网站根目录)
├文件夹
│ │
│ └1.php
├文件夹
│ │
│ └2.php
└index.php
 
问题:在1.php中通过include(“../B/2.php”)来引入B目录下的2.php文件;
在index.php中通过include(“A/1.php”)来引入A目录下的1.php文件;
运行出来当然会出现问题,找不到../B/2.php文件。
 
这是因为:
 
1.php被编译到index.php中执行,也就是相当于1.php同index.php一样位于网站根目录下,但是在1.php别忘记了一段代码include(“../B/2.php”);
“../”意味着什么?上一级目录,现在1.php已经在根目录下了,这时候再上一级,那就已经找不到2.php了,所以问题就出现在此。
 
很多人会想到include(“/B/2.php”),这样不就好了,同样不行php不同于我们的jsp,在include中使用”/”并不是我们所想象的网站根目录,它代表的的
当前的目录,因此还是不行。
 
既然不能用相对的,那我们可以改用绝对路径的方式。只是在包含文件之前,先包含一个global.php
文件。这个文件的内容是:
 
<!--?php
chdir(dirname(__FILE__));
?-->
 
它的作用是将当前目录切换到global.php所在的路径。
将global.php放在根目时录下,在这之后包含的所有文件就会以根目录为基准了。
 
例如,在2.php中引用1.php,则通过2步:
 
1.require(dirname(__FILE__).‘/../global.php’);//视具体的目录情况,反正是要指回到根目录下的global.php
 
2.require(‘A/1.php’)//从根目录开始定位
 
这样的话,不管页面在哪一级目录,我都可以去引用,不用再担心路径问题了!
 
注:chdir()函数的用法
相关函数:getcwd, chroot

头文件:#include <unistd.h>

定义函数:int chdir(const char * path);

函数说明:chdir()用来将当前的工作目录改变成以参数path 所指的目录.

返回值执:行成功则返回0, 失败返回-1, errno 为错误代码.

范例
#include <unistd.h>
main()
{
    chdir("/tmp");
    printf("current working directory: %s\n", getcwd(NULL, NULL));
}

执行:
current working directory :/tmp

以上是关于求批处理命令解决多层文件夹嵌套的问题的主要内容,如果未能解决你的问题,请参考以下文章

nodejs Async 使用方法(解决多层回调嵌套)

win 7 cmd命令窗口 一弹出来就自动关闭 急求方法解决

springboot处理fastjson的多层嵌套

keil4预处理器宏过于嵌套怎么解决?

求一个格式化的批处理命令

求 at 命令 制定 批处理 每天运行 和 登录后运行,谢谢!