文件夹 名称: 风景图片【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