无忧启动论坛

标题: 请教一个批处理 删除子文件夹保留子文件夹里的文件 [打印本页]

作者: 2010无忧    时间: 2022-2-12 20:58
标题: 请教一个批处理 删除子文件夹保留子文件夹里的文件
本帖最后由 2010无忧 于 2022-2-13 02:12 编辑

比如我D盘有很多文件夹 ,A文件夹 B文件夹 C文件夹 等等,每个文件夹下又有很多子文件夹,A下有A1 、A2 。B下又B1 、B2文件夹。A1、B1文件夹下面可能还有子文件夹。我想把所有子文件夹都删掉,但保留文件,文件格式就几种常见的图片 文档之类的。比如A文件夹下所有文件包括子文件夹里的文件都保存在A文件夹下,子文件夹都删掉。想求一个批处理,运行后的效果就是 只保留 A、B 、C这些一级文件夹,里面的子文件夹都删掉,文件保留。
@echo off
for /r . %%a in (*.jpg *.doc) do if exist "%%a" move /y "%%a" .

for /f "delims=" %%i in ('dir /ad /b /s ^|sort /r') do (

rd "%%i">nul 2>nul &&if not exist %%i\ echo 成功删除:%%i

)

pause
上面这个批处理放到A 文件夹目录下  ,可以做到把A目录下所有子文件夹删除且保留文件。
但是我想 批量处理 D盘下单 ABC 等等所有文件夹  就不知道怎么修改了
应该是再加个循环就行了,可是就是弄不好
请了解批处理的朋友指导一下    谢谢!!!



作者: plusv    时间: 2022-2-12 21:40
本帖最后由 plusv 于 2022-2-12 21:45 编辑

我建议,
只要

@echo off
for /r . %%a in (*.jpg *.doc) do if exist "%%a" move /y "%%a" .

没问题后,

手动检视 二级以上文件夹,确认没有你要保存的文件,
手动删除,避免发生悲剧.

PS:
move /y "%%a" .
建议拿掉 /y 不然有同名的文件只会有一个.


作者: 2010无忧    时间: 2022-2-12 21:43
plusv 发表于 2022-2-12 21:40
我建议,
只要

没事,整个盘的文件都有备份,只是想知道批处理怎么写
作者: plusv    时间: 2022-2-12 21:55
2010无忧 发表于 2022-2-12 21:43
没事,整个盘的文件都有备份,只是想知道批处理怎么写

你先弄个 虚拟盘 或 虚拟机 测试,避免发生悲剧.
未测试,思路推论修改.

@echo off
for /r d:\a %%a in (*.jpg *.doc) do if exist "%%a" move /y "%%a" d:\a
for /r d:\b %%a in (*.jpg *.doc) do if exist "%%a" move /y "%%a" d:\b
for /r d:\c %%a in (*.jpg *.doc) do if exist "%%a" move /y "%%a" d:\c

for /f "delims=" %%i in ('dir d:\a /ad /b /s ^|sort /r') do (
rd "%%i">nul 2>nul &&if not exist %%i\ echo 成功删除:%%i
)

for /f "delims=" %%i in ('dir d:\b /ad /b /s ^|sort /r') do (
rd "%%i">nul 2>nul &&if not exist %%i\ echo 成功删除:%%i
)

for /f "delims=" %%i in ('dir d:\c /ad /b /s ^|sort /r') do (
rd "%%i">nul 2>nul &&if not exist %%i\ echo 成功删除:%%i



作者: sunsea    时间: 2022-2-12 21:57
本帖最后由 sunsea 于 2022-2-12 22:08 编辑

放到D盘根目录下执行。没测试,建议先小规模试用。
  1. @echo off
  2. pushd "%~dp0"
  3. for /f "delims=" %%x in ('dir /a:d /b') do (
  4.     pushd ".\%%x"
  5.     for /r . %%a in (*.jpg *.doc) do if exist "%%a" move /y "%%a" .
  6.     for /f "delims=" %%i in ('dir /ad /b /s ^|sort /r') do (
  7.         rd "%%i">nul 2>nul &&if not exist %%i\ echo 成功删除:%%i
  8.     )
  9.     popd
  10. )
  11. pause
复制代码


小修了一下,忘了一个delims=
作者: 2010无忧    时间: 2022-2-12 21:59
plusv 发表于 2022-2-12 21:55
你先弄个 虚拟盘 或 虚拟机 测试,避免发生悲剧.
未测试,思路推论修改.

你这是指定文件夹名呀,问题是我这里有百十个文件夹,要一个个指定名字就太费劲了,有没有自动获取的办法
作者: nttwqz    时间: 2022-2-12 22:00
要啥批处理,搜索*.*,详细信息视图,类型不勾选文件夹,全选文件,剪切,粘贴,搞定!
作者: 2010无忧    时间: 2022-2-12 22:03
plusv 发表于 2022-2-12 21:55
你先弄个 虚拟盘 或 虚拟机 测试,避免发生悲剧.
未测试,思路推论修改.

尝试改成这样
    @echo off
   
    for /d %%b in (*) do (
        for /r    %%a in (*.jpg *.doc) do if exist "%%a" move /y "%%a"  "%%b\"
     
    )
    pause
结果都给弄到最后一个文件夹里去了,循环写的不对,就是不知道怎么改
作者: 2010无忧    时间: 2022-2-12 22:08
nttwqz 发表于 2022-2-12 22:00
要啥批处理,搜索*.*,详细信息视图,类型不勾选文件夹,全选文件,剪切,粘贴,搞定!

你这只能一个文件夹一个文件夹的弄   慢,所以才想用批处理操作
作者: sunsea    时间: 2022-2-12 22:09
pushd和popd是个好东西的。
作者: 2010无忧    时间: 2022-2-12 22:26
sunsea 发表于 2022-2-12 22:09
pushd和popd是个好东西的。

能不能给出具体的批处理
作者: plusv    时间: 2022-2-12 22:26
本帖最后由 plusv 于 2022-2-12 22:29 编辑
2010无忧 发表于 2022-2-12 21:59
你这是指定文件夹名呀,问题是我这里有百十个文件夹,要一个个指定名字就太费劲了,有没有自动获取的办法

>你这是指定文件夹名呀,问题是我这里有百十个文件夹,要一个个指定名字就太费劲了,有没有自动获取的办法

这需要 2 个 For
第 1 个 For 取得 文件夹
再传入给 第 2 个 For 使用.


@echo off

for /f %%i in ('dir d:\ /ad /b') do (
@echo %%~fi
echo for /r %%~fi %%a in ^(*.jpg *.doc^) do if exist "%%a" move /y "%%a" %%~fi

pause
)





作者: sunsea    时间: 2022-2-12 22:27
2010无忧 发表于 2022-2-12 22:26
能不能给出具体的批处理

在5楼。
作者: 2010无忧    时间: 2022-2-12 22:33
sunsea 发表于 2022-2-12 22:27
在5楼。

真的可以了,谢谢!!!  我学习一下
作者: 527104427    时间: 2022-2-12 22:39
本帖最后由 527104427 于 2022-2-13 08:20 编辑

考虑PECMD脚本吗?放到根目录就行。

#code=936T950
ENVI^ EnviMode=1
ENVI^ ForceLocal=1
FORX @%CurDir%\*,DirList,0,*
FIND *DirList<>,
{
        FORX *NL DirList,Dir,
        {
                FORX @%Dir%\*,DirList2,0,*
                FIND *DirList2<>,
                {
                        FORX *NL DirList2,Dir2,
                        {
                                FORX /s %Dir2%\*,FileList,0,FILE %FileList%->%Dir%\
                                FILE -force %Dir2%
                        }
                }
        }
}
mess 批量成功





作者: 2010无忧    时间: 2022-2-12 22:53
527104427 发表于 2022-2-12 22:39
考虑PECMD脚本吗?放到根目录就行。

#code=936T950

这个要搭配 PECMD.EXE 用吧,能简单解释一下你写的命令吗?
作者: 2010无忧    时间: 2022-2-13 02:11
nttwqz 发表于 2022-2-13 00:12
纯手机敲打,正确与否不得而知,请自测,后果自负。

这个运行后文件全删了,估计代码有问题,用5楼的代码正常。谢谢了
作者: qingyi78    时间: 2022-2-13 02:44
用WINRAR 添加整个父文件夹到压缩包,添加时选择添加后删除源文件,解压缩时选择不解压路径,
作者: nttwqz    时间: 2022-2-13 06:42
2010无忧 发表于 2022-2-13 02:11
这个运行后文件全删了,估计代码有问题,用5楼的代码正常。谢谢了

这个点还不睡觉吗。。。

手机上看不到命令回显,和想象中有出入。有的正常就好。
作者: 2010无忧    时间: 2022-2-13 13:36
nttwqz 发表于 2022-2-13 06:42
这个点还不睡觉吗。。。

手机上看不到命令回显,和想象中有出入。有的正常就好。

周末一般睡的比较晚,我属于那种能熬夜但不能早起的人




欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3