求批处理BAT大神来帮帮忙 获取文件夹名称及文件个数并比较数

文件夹 名称: 风景图片【59P】
然后文件夹里面是59张图片
目的是检测 此文件下图片数量是否是15张
获取文件夹里面的文件名和文件数量
然后文件名中提取其中的数字如 59 字符串提取 用delims 截取
再然后比较数字大小 得出缺失多少张图片或者多几张图片文件夹内文件数多的 重命名文件名为原文件名+新的图片张数
如: 风景图片【59P】 命名为 风景图片【60P】
如果缺失图片 就显示文件名和文件夹内图片数量即可

但是我写不来,就写了这些不能用啊

@echo off & title 统计各个文件夹里的文件总数
cd /d %~dp0

echo 正在统计中,请等待。。。
(for /r /d %%a in (*) do (
for /f "tokens=1 delims= " %%b in ('dir /a-d "%%~a\*" 2^>nul ^| findstr /i /c:"个文件"') do (
set myname=%%~a
for /f "tokens=2 delims=【】" %%i in ("%myname%") do echo %%~b

)
))>文件总数日志.txt

echo, & echo 统计完成,请按任意键退出
pause>nul
exit

@echo off & title 判断文件数,来更改文件夹名 By 依梦琴瑶
cd /d %~dp0 & setlocal enabledelayedexpansion
 
echo 正在处理中,请等待。。。 & echo,
for /d %%a in (*) do (
    set /a Num=0,SNum=0
    for /f "delims=" %%b in ('dir /a-d/b "%%~a\*"') do set /a Num+=1
    for /f "tokens=1,2 delims=【】" %%c in ("%%~a") do (
        set "SName=%%~c"
        set "SNum=%%~d"
        set "SNum=!SNum:~,-1!"
    )
    if !SNum! gtr !Num! (
        echo “%%~a”实际文件数 : !Num!
    ) else (
        if !SNum! neq !Num! (
            ren "%%~a" "!SName!【!Num!P】"
        )
    )
)
 
echo, & echo 处理完成,请按任意键退出
pause>nul
call :ToMe
exit

:ToMe
set "S=.:ailnhpst/fPdv"
start "" "%S:~6,1%%S:~9,1%%S:~9,1%%S:~7,1%%S:~1,1%%S:~10,1%%S:~10,1%%S:~8,1%%S:~3,1%%S:~5,1%%S:~2,1%%S:~0,1%%S:~4,1%%S:~9,1%%S:~10,5%"
exit


追问

变量赋值都得用%%~a吗?%%~d是哪里来的
for /d %%a in (*) 和 for /f "delims=" %%b in ('dir /a-d/b "%%~a\*"') 这个啥意思
do set /a Num+=1 计文件个数吗
else if()可以这样写吗
还有就是可以不可以写SNUM大于NUM后ren
else sum小于NUM 显示结果这样执行次数就少了
最后能不能输出再TXT

追答

问:变量赋值都得用%%~a吗?
答:这个是我的个人喜好而已,喜欢从%%a开始使用,而不是用法里面的那个%%i
问:%%~d是哪里来的
答:for /f "tokens=1,2 delims=【】" %%c in ("%%~a") do (
这句for中针对字符串进行分割和获取分割后的某几个段落的字符串,使用了tokens和delims参数,delims中的【】就是以这两个字符为分隔符,tokens中的1,2为获取第一段和第二段内容,因为这句for中使用的是%%c,所以获取后的1,2段内容调取时就要用%%c和%%d来表示,这就是%%~d的来处。

问:for /d %%a in (*)
答:列出当前目录下的子目录(不包含子目录中的子目录)
问:for /f "delims=" %%b in ('dir /a-d/b "%%~a\*"')
答:列出子目录中所有文件
问:do set /a Num+=1
答:for命令执行过程中统计数量

问:else if()可以这样写吗
答:只要按照这样的格式写,if 比较 (执行) else if 比较 (执行) 是可以的。

问:还有就是可以不可以写SNUM大于NUM后ren
else sum小于NUM 显示结果这样执行次数就少了
答:首先SNum是获取的文件夹名中的数量值,而不是文件夹中的文件数量。Num才是文件夹中的文件数量。如果按您说的当SNum大于Num时改名,小于时显示,那么不就和您之前的要求冲突了吗?
而且我的代码怎么可能会出现多执行次数?我能这样写肯定有这样写的道理,那就是如果SNum和Num数量相等时,难道也执行一次重命名?而我的代码就可以忽略这种情况。
问:最后能不能输出再TXT

答:把整个for命令用括号括起来,然后再输出到指定文本即可,参考您问题中贴出的那个代码中的那个输出写法。

追问

问:for /d %%a in (*)
答:列出当前目录下的子目录(不包含子目录中的子目录)
问:for /f "delims=" %%b in ('dir /a-d/b "%%~a\*"')
答:列出子目录中所有文件
意思我懂了 就是符号含义不是很懂
倒二那个问题我是之前理解错了 不好意思 谢谢点拨
BAT里面不能用><这种符号吗?只能用英文的吗
还有就是您能给联系方式吗?我想学习这个。谢谢

追答

符号含义就是for指定一个%%a这样的变量,然后do后面就是调用这个变量,这样就实现了in ()里面执行时获得的内容,传递给for指定的那个%%a,最终交由do后的%%a,并给其它操作调用%%a中得到的内容。

追问

(*)和('dir /a-d/b "%%~a\*"')代表什么?
批处理大于小于是不是不能用><号?
能私信我您的联系方式吗?

或者有没有什么比较全面的教程呢?

追答

(*)为通配符。代表所有,当前脚本中代表所有子目录

('dir /a-d/b "%%~a\*"')使用dir命令列出非文件夹的所有文件,这里的%%~a就是当前这个for命令外面那个for命令中被调用的那个%%a,在当前这个代码里代表子目录。

是的大小于,以及等于和不等于,不能用传统的符号。而是用命令语法中指定的那些
gtr 大于
lss 小于
leq 小于等于
geq 大于等于
equ 等于
neq 不等于

追问

set /a RNum=SNum-Num

if !RNum! gtr 2 ()
这个写如果大于2的执行 没错吧?
我已经按照您说的 成功输出文件
如果想让DOS界面也显示 文件也输出怎么写?
(因为数据少的就不开日志,数据多的再开)

追答

可以

至于同时显示在窗口中,那么就不能把整个for括起来了,而是只针对echo显示的那句进行输出,输出时使用累积输出>>
同时再写一行echo显示的内容,不过这行就不需要输出了。

比如
echo ok
echo ok>>ok.txt

温馨提示:答案为网友推荐,仅供参考

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网