[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] 求教批处理只保留指定文件夹和文件

1
最近想学点批处·理技巧,现遇到了难题,特来求教!

2
问题
d:\1\ 下有好多文件和文件夹。
只保留以111和222为开头的文件夹,以333和444为开头的文件,
以及所有.ini和.exe文件。

要求
要同时满足上述所有条件。
弃用move命令。
最好别用>1.txt这样的命令。

应该是得用set, for, if, rd, del等命令,
想了好久,未得解法。
现来求教,求指点。
多谢!

回复 59# qixiaobin0715


TOP

本帖最后由 smatenchen 于 2022-8-19 21:54 编辑

回复 57# qixiaobin0715

回复 49# hfxiang

回复 3# Batcher

1,
非常感谢!


2,
多般猜测不如测试一下。


3,
(.,*),其中.,*是指.和*,,起分隔作用,相当于空格,是或的意思。
但是,用.是表示把字符命令下某个目录下的1个空目录列举出来的意思。


4,
没错,这种用法会造成后面操作上的麻烦,实不可取也,适合作为一种解法思路去做参考。


5,
还是那句话,微软的东西真的很烂!
这个for命令,就设计得很烂,很不规范,不一致,功能上很残缺!

TOP

本帖最后由 qixiaobin0715 于 2022-8-19 15:34 编辑

for /r %%a in (.,*) do(还是那句话,试试即知)
不必研究这个了。我认为是为了在一个for循环里同时得到当前文件夹下的所有文件及文件夹(包括子文件夹和其中的文件),这种用法是有缺陷的,后续处理麻烦。推荐使用:
  1. for /f "delims=" %%a in ('dir /b /s') do ...
复制代码

TOP

回复 54# qixiaobin0715

:'(

TOP

本帖最后由 smatenchen 于 2022-8-19 15:01 编辑

回复 52# qixiaobin0715

回复 49# hfxiang

回复 3# Batcher

1,
非常感谢!


2,
4,
for /r %%a in (.,*) do (
这句其中的(.,*),是何意呢?.,*这代表什么呢?是指当前目录下文件名开头处含有.,这两个字符的任何文件吗?


你看懂了其中的(.,*)吗?.,*这是什么含义呢?
你看懂了,请帮忙解说一下吧?我至此,还是没弄懂呀!


3,
5,
if /i not "[%cd%]"=="[%%~fa]"
这句也不对吧?这个方括号[]起什么作用呢?
当前目录,不等于,%%a的完整路径名?这本来就是不等于的吧?又何必再用if去判断一下呢?


这里的方括号[],又起什么作用呢?


4,
拢共有那么多条发问,干嘛没有逐条解答呢?先师们解答了所有发问,我不就又提高了一小步吗?
故,还望不吝赐教于我,一个初入门,后学者呀!


拜谢!

TOP

回复 50# qixiaobin0715

回复 49# hfxiang

回复 3# Batcher

回复 48# smatenchen
1.”鄙人“是显得有学问还是谦虚的说法?总之我觉得在这里是不合时宜的。


是谦虚的说法。我刚学批处理,有很多不懂的,故用鄙人自称,是不敢托大。既然先师不喜欢,那就用我自称。


2.代码没有万能的,只能是就事论事,不可能考虑所有特殊性,比如特殊字符、效率、文件及文件夹的属性。


发问时,我就想着要一并处理隐藏文件,所以,我会在意有没有做到这一点。


3.上面代码只是单从效率角度来说的。


仅是用户普通文件操作,非服务器大数据处理操作,故代码简单才是首选。


4.别人帮你写代码,不管是否经过测试,总体来说测试这件事是你的本分,而不能强求写代码的人去测试。


这话就没道理了!大家都该对自己做的事去负责,直到底呀!正所谓,送佛送到西,帮人帮到底嘛!


5.最好自己测试后,才能对代码提出问题,不能看到代码就说这句不对,那句不行。


敏而好学,学而多思,不知多问,不亦悦乎?哈哈!我是来学习,能讨论就加入讨论的呀!


另外,一般来说,大家都能看的清,字体不必要太大呀。


字体大点,主要是想方便我,而非其它,要不然我看着费眼力。

TOP

回复 46# qixiaobin0715

{
@echo off
setlocal enabledelayed
for %%i in (333 444 .ini .exe .bat) do set _%%i=true
for %%i in (111 222) do set #%%i=true
for /d %%i in (*) do (
    set str=%%i
    if not defined #!str:~,3! rd /q /s "%%i"
)
for %%i in (*) do (
    set str=%%i
    if not defined _%%~xi (
        if not defined _!str:~,3! del "%%i"
    )
)
pause
}


1,
非常感谢!


2,
把代码写成这样,似乎是在倒着走啊!


3,
不用dir /a /b命令,隐藏文件处理得了吗?


4,
本已把解法处理得很好了,却非要舍易求难,鄙人只好对此说佩服了!

TOP

回复 48# smatenchen


    你自行测试一下不就知道对错了????

TOP

本帖最后由 smatenchen 于 2022-8-19 08:51 编辑

回复 39# hfxiang

回复 40# qixiaobin0715

回复 3# Batcher

{
@echo off
@rem 只保留以 111 和 222 为开头的文件夹,以 333 和 444 为开头的文件,以及所有.ini 和.exe 文件。
@setlocal enableDelayedExpansion


for /f "delims==" %%a in ('set _retain_ 2^>nul') do set "%%a="
set "_retain_Folder_111=True"
set "_retain_Folder_222=True"
set "_retain_File_333=True"
set "_retain_File_444=True"
set "_retain_File_.ini=True"
set "_retain_File_.exe=True"


for /r %%a in (.,*) do (

set "Dir_a=%%~aa"

set "Dir_x=%%~xa"

set "Dir_n=%%~na"

set "Dir_n=!Dir_n:~0,3!"

if /i not "[%cd%]"=="[%%~fa]" if /i not "[%~f0]"=="[%%~fa]" if defined Dir_a if "[!Dir_a:~0,1!]"=="[d]" (

if not defined _retain_Folder_!Dir_n! rd /q/s "%%~fa"

) else (

set "_retain_File_T="

if defined _retain_File_!Dir_n! set "_retain_File_T=True"

if defined _retain_File_!Dir_x! set "_retain_File_T=True"

if not defined _retain_File_T del/f/s/q "%%~fa"

)
)


endlocal
echo;&pause
exit /b
}


1,
非常感谢!


2,
你自己测试过你写的这些代码,验证过它有效吗?


3,
set "Dir_a=%%~aa"
这句应该是错的吧?
应该写成 set "Dir_a=%%~da" 或 set "Dir_d=%%~da" 吗?
若是你写错了,那后面引用它时,也该都错了。


4,
for /r %%a in (.,*) do (
这句其中的(.,*),是何意呢?.,*这代表什么呢?是指当前目录下文件名开头处含有.,这两个字符的任何文件吗?


5,
if /i not "[%cd%]"=="[%%~fa]"
这句也不对吧?这个方括号[]起什么作用呢?
当前目录,不等于,%%a的完整路径名?这本来就是不等于的吧?又何必再用if去判断一下呢?


6,
if defined Dir_a
前面不是已经做了定义吗?还要再用if去做判断吗?喏,set "Dir_a=%%~aa" 。


7,
if "[!Dir_a:~0,1!]"=="[d]"
前面的set "Dir_a=%%~aa",应该是定义错了,应该是set "Dir_d=%%~da",
那后面就应该写成if "[!Dir_d:~0,1!]"=="[d]"吧?


8,
还有,
对于有隐藏属性的文件及文件夹,怎么处理呢?
不用dir /a /b命令,它们就是隐形的,for命令本身枚举不了它们。
哈哈!你们考虑过这一问题吗?


9,
另外!
Batcher,
之前,鄙人在查看qixiaobin0715的回复时,点了一下上方蓝色提示条的关闭按钮。
之后,当qixiaobin0715再回复鄙人时,论坛就不再发消息通知鄙人了。
坛主,有办法恢复通知功能吗?


10,
此外!
若需要在for %%a in () ,中的()里是多条带空格的字符串时,用""把带空格的字符串括起来,
但运行时%%a的值也是带了""号的。
如何天然地使它去掉""号,而不是去使用%%~a才办到呢?


若情况变为,需要在for /f %%a in () ,中的()里是多条带空格的字符串时,应该写成怎样的代码呢?
难道是要像Batcher之前那样,在()里套for循环命令,或者是把多条带空格的字符串写入某个文本文件1.text里吗?

TOP

回复 45# hfxiang


   

TOP

效率是个复杂的问题:
1.单独使用管道、单独使用命令及单独使用for循环,在效率上都没有问题,组合起来就有可能影响效率;
2.实际上40楼后2个for循环与命令dir连用也会影响效率;
40楼代码可以这样改写:
  1. @echo off
  2. setlocal enabledelayed
  3. for %%i in (333 444 .ini .exe .bat) do set _%%i=true
  4. for %%i in (111 222) do set #%%i=true
  5. for /d %%i in (*) do (
  6.     set str=%%i
  7.     if not defined #!str:~,3! rd /q /s "%%i"
  8. )
  9. for %%i in (*) do (
  10.     set str=%%i
  11.     if not defined _%%~xi (
  12.         if not defined _!str:~,3! del "%%i"
  13.     )
  14. )
  15. pause
复制代码

TOP

回复 44# smatenchen


    本人认为更高效,但实际情况你可以用大量一点的数据来测试对,有时还是相信自己的测试比较好!

TOP

回复 43# hfxiang

1,
非常感谢!


2,
鄙人分析代码时,感觉=true只是起一个标记的意义。
现在,你把它证实了。


3,
说实在的,把解法代码写成这些做判断的代码会比写成用 | 连接的代码,其运行时会更有效率吗?

TOP

回复 42# smatenchen


用什么都一样,这个只是表示标识的存在与否,更直白地说是这个标识“有值”和“无值”的问题

TOP

返回列表