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


   
您好!
if "%%~xa"=="" (
这个语句是何意?
%%~xa
这是什么变量?
怎么还带上了~x,是何意?
您好像没先定义出%%~xa这个变量吧?
没看懂,请您解说一下吧!
多谢!

TOP

回复 27# xp3000


   
多谢!
没仔细看,漏看了您的这个语句。
受教了!您费心了!

TOP

回复 5# qixiaobin0715


   
您好!
('dir /b /ad ^|findstr /vb "111 222"')
这里用^| 是何意?
干嘛要转义?直接用管道 | 接上不行吗?
多谢!

TOP

回复 6# xp3000


您好!
pushd popd
这两个起什么作用?
多谢!

TOP

回复 6# xp3000


您好!
exe$ ini$
这个是何意?

"^111 ^222"
这是何意?转义?
这是什么用法?
多谢!

TOP

回复 6# xp3000


您好!
2>nul
这是什么用法?
多谢!

TOP

回复 6# xp3000 Batcher qixiaobin0715

{
@cd /d  d:\1\


@echo off & setlocal EnableDelayedExpansion
for /f "tokens=*" %%i in ('dir /a:d /b *') do (echo 搜索目录"%%i"&echo.
    for /f "delims=" %%j in ('echo %%i^| findstr /i /v "^111 ^222"') do echo 删除非匹配目录"%%j"&echo.&rd "%%j" /s /q
        for /f "delims=" %%k in ('echo %%i^| findstr /i /r /x "^111.* ^222.*"') do (echo 符合要求,即将切换.......
    pushd %%k&echo 切换目录"%%k"
        for /f "delims=" %%l in ('dir /b/a-d/on *.*^| findstr /i /v "^333 ^444"^| findstr /i /v "exe$ ini$"') do (
            echo 搜索到非匹配文件,删除"%%l" & del /f /s /q "%%l"
            )
    popd&echo.退出目录"%%k"&echo.
    rd "%%k" 2>nul&echo 如果"%%k"为空文件夹将删除
        )
    )
)
pause
}


1,
非常感谢!


2,
以上你写的代码你自己是否测试过呢?


3,
套了这么多层循环,运行效率,速度,肯定不高,将会有一长串运行结果啊!


4,
其运行逻辑,并不够清晰,代码庞杂,纠错时费力。


5,
其运行时会一闪而过,代码里的提示词就显得是多余的了。


6,
与第5楼的代码,实在是没法相提并论。
{
@echo off
for /f "delims=" %%a in ('dir /b /ad ^|findstr /vb "111 222"') do rd %%a
for /f "delims=" %%b in ('dir /b /a-d ^|findstr /ev ".ini .exe .bat"^|findstr /bv "333 444"') do del %%b
pause
}


7,
简单非常重要啊!你把原本简单的搞到极度复杂了!唉!

TOP

回复 12# newswan

1,
非常感谢!


2,
你写的代码,其中的<,>,应该是\<xyz,xyz\>。

TOP

回复 40# qixiaobin0715

回复 39# hfxiang

{
@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 /f "delims=" %%i in ('dir /b /ad') do (
    set str=%%i
    if not defined #!str:~,3! rd /q /s "%%i"
)
for /f "delims=" %%i in ('dir /b /a-d') do (
    set str=%%i
    if not defined _%%~xi (
        if not defined _!str:~,3! del "%%i"
    )
)
pause
}


1,
非常感谢!


2,
二位的的解题思路,挺广阔啊!


3,
你写的代码里,其中do set _%%i=true,do set #%%i=true里的,=true改成=0或1或false或aa或123,应该都是可以的吧?

TOP

回复 43# hfxiang

1,
非常感谢!


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


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

TOP

回复 45# hfxiang


   

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

回复 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

回复 50# qixiaobin0715

回复 49# hfxiang

回复 3# Batcher

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


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


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


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


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


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


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


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


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


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


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


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

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

返回列表