批处理练习(3) 文件处理 制作进度条 判断字符长度2011-06-18 18:25题1:批处理修改文件夹名。
在一个历史学院的文件夹里有2530个子文件夹,里面都有这个学院的学生的资料。这些子文件夹是:12位的学生学号和对应学号
的姓名:104052020001陈娜娜 104052020002马克林那 104052020003林肯 。。。。
现在我们只想保留这些学号的后4位,也就是号数如:1 2 3 ......
请写上你的答案,一起分享吧!!
因为原来的文件夹里有内容,所以我们是将源文件夹进行重命名,使用ren
又是对一堆文件夹进行操作,所以使用 for /d
还有就是处理像0010这样的又不能直接%b:0=%所以就想用for /f “tokens=* delims=0”
我就在这个历史学院的文件夹里建立一个批处理,我的代码:
@echo off
setlocal enabledelayedexpansion
for /d %%a in (*) do (
set n=%%a
set nn=!n:~8,4!
for /f "tokens=* delims=0" %%b in ("!nn!") do (
set rn=%%b
ren %%a !rn!
)
)
pause
题2:如何去除文本文档里所有重复的字符串?并进行处理
在1.txt文档里有很多字符串都以空格相连:
1 2 3 6 5656 不要 去死 999
2 我是谁 xx ff不要 999 56565
......
用批处理将没有重复的所有字符串提取出来放在2.txt中。
我的答案:
用定义变量的方法,就是没拿到其中的每一个字符串,是新的就对他进行定义,是已经定义了的就跳过,这就
用到了if not defined 变量名 (定义新字符串 )
那我们如何取得每一个字符串呢?用for /f “delims= ” %%a in (1.txt)这样的话tokens又该怎么办成千上万的字符串啊!
想到因为每个字符串都间都有空格,用没有参数的for就可以取得每一个字符串了。可是没有参数的for在括号里的只能是
字符串啊,我们该如何把1.txt离得内容给放到括号里呢。我是用for /f “delims=”一行一行的放进去的。
我在当前文件夹下建立批处理文件内容如下:
@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%a in (1.txt) do (
for %%b in (%%a) do (
if not defined %%b (
set %%b=1
rem 这里是随意给个值
set /p=%%b
rem 这里如果用>2.txt 试试看会有什么结果说明了什么
pause
如果你觉得在()>>2.txt 很不习惯你也可以在用:set m=!m! %%b 在for前定义一个空变量set "m=" 然后再for后输出m:echo !m!>2.txt
当然了最简单的还是用:set /p=%%b
好!做到这里就得到了2.txt。可是由于使用set /p=%%b
为此我们再来练习一下:就是把上面的2.txt进行整理使之每一行都只有10个字符串。
下面是我的代码:
@echo off
setlocal enabledelayedexpansion
set /a n=0
for /f "delims=" %%a in (2.txt) do (
for %%b in (%%a)do (
set /a n+=1
if !n!==10 (
echo %%b >>1111.txt
set /a n=0
) else (
set /p=%%b
)))
pause
那如果原来的字符串不是都在同一行的话,也就是每行都有不定个字符串,又该怎么办?把不熟悉的化成熟悉的呗。
不是同一行我们就把它变成同一行(这个也不难),然后就简单喽!
得出了1111.txt。现在我又想从1111.txt中查看一些字符串共出现了多少次。
我的代码如下:
@echo off
setlocal enabledelayedexpansion
echo 从1111.txt中查找字符串出现的次数
set /p cc=您要查找的是:
set /a n=0
for /f "delims=" %%a in (1111.txt) do (
for %%b in (%%a) do (
if "%%b"=="!cc!" (
set /a n+=1
)))
echo 所查找的!cc!共出现了!n!次。
pause
题3:制作一个进度条。
网上好多关于用批处理制作进度条的,于是自己也想试着做一下,刚开始的代码:
@echo off
echo ┏━━━━━━━━━┓
set /p "a= "
set /p=■
)
echo.
echo ┗━━━━━━━━━┛
pause
哈哈!!!结果很悲剧!边框都不完整两边都没有,而且是先显示的只有上边框没有下边框。
就想着上网去看,发现看代码真是蛋疼,相当的晕!!!
无奈只好自己慢慢想把。
要想同时显示上下边框这个简单只要把边框全部放入for循环中。
至于显示边框的两边,要结局的就是对其,我就想到用 %变量:~0,数值% 来解决了,但是又发现■占两个空格,这就说明
%%里的数值不是固定植,正好for /l 循环中的数是变化的,就可以拿来用了。
改进后的代码:
@echo off
setlocal enabledelayedexpansion
color 1f
set "nn=■"
for /l %%a in (39 -1 20) do (
cls
rem 刚开始没这个,结果一列下来,悲剧!
set "nnn=!nn! "
set m=!nnn:~0,%%a!
echo ┏━━━━━━━━━━━━━━━━━━━━┓
set /p=┃
echo ┗━━━━━━━━━━━━━━━━━━━━┛
set nn=!nn!■
ping /n 2 192.168.1.103>nul
rem 时间延时用,这里ping的地址在测试时自行更换,当然了也可以用for及其他的时间延时方法,很多
rem 可是很多我还不理解,继续学习以后可能也会做个总结。
)
pause
题4:(复习)如何检测给定字符串的长度?
这个做过了,以前不会,现在会了自己也写一写。如下:
@echo off
title 字符长度查看
color 0f
mode con cols=40 lines=25
echo.&echo.
echo ----------------------------
echo.&echo.&echo.&echo.&echo.
setlocal enabledelayedexpansion
set /p b=输入的要判断的字符串:
set a=!b!
:aa
if "!a!" neq "" (
set /a n+=1
set a=!a:~0,-1!
goto aa
)
echo.&echo.&echo.&echo.
echo 您输入的!b!字长为:!n!
echo.&echo.&echo.&echo.&echo.
echo 再见!
echo.&echo.
echo --------------------------
@echo off
set dir=C:\test
set /a s=1024*1024*1024
for /f "tokens=3 delims= " %%i in ('dir /s /a /-c "%dir%" ^|findstr 个文件') do (set z=%%i)
echo 文件夹:%dir%&echo.
echo 总大小:%z%&echo.
if %z% LSS %s% echo 该文件夹内容小于1G
pause>nul
@echo off & setlocal enabledelayedexpansion
set "folder=D:\Program Files\Call of Duty"
::folder为路径。不算很准。但是如果不是1GB左右差别很小(很小的)的可以计算出来。
for /f "tokens=* delims=" %%i in ('dir /a-d /b /s "%folder%"') do set /a num+=%%~zi/1024
if !num! gtr 1048576 (echo 该文件夹大于1G) else (echo 该文件夹内容小于1G)
pause