【教程】for命令-从入门到精通
bat吧
全部回复
仅看楼主
level 13
我相信大多数人对于for都是似懂非懂……主要原因就是,大多数教程为求懒求快,直接复制for /?的机器翻译,导致基本没人看得懂……本文承诺:绝不使用机器翻译帮助,有问必答,祝大家学习愉快。
2016年05月26日 11点05分 1
level 9

抢楼,对了,楼主,发呀
2016年05月26日 11点05分 2
。。。。。。
2016年06月05日 07点06分
[呵呵]
2017年01月06日 10点01分
原创求加精 @超人硬汉 @tmxk0411
2017年01月11日 00点01分
level 13
1.批量执行 for [/D] [/R [路径]] %%变量 in (集合) do (命令)
/D  只搜索文件夹名[可选],若无该选项即为 只搜索文件名
/R [路径]  搜索子目录[可选]
路径  搜索指定目录[可选](这个鸡肋参数要求必须开启 搜索子目录 才能用,若想指定搜索目录普遍做法是先用cd /d跳转目录)若无该选项即为 搜索当前目录
%%变量  只能是一个字母,用于在命令中使用,代表搜索结果。(该变量是全局的!)
集合  指定一个或一组文件。可以使用通配符搜索。(也可以指定文本,用空格分隔,特殊文本用双引号括住)(通配符*表示0个或多个字符,通配符?表示0个或1个字符)
命令  指定批量执行的命令。使用%%变量 指定搜索结果。
@echo off
for %%i in (*.bat) do (echo %%i)
::这段代码会显示当前文件夹(不含子文件夹)下所有的bat文件的文件名
for %%i in (菜 芽 小 公 公) do echo %%i
pause>nul
::这段代码会显示什么?试试看!
注意:for搜索并不会搜索隐藏文件,因此若要搜索隐藏文件……过会儿再讲
作业:按Win+R键运行cmd,然后自行思索命令怎么写
1.搜索当前目录,目录名中包含es的目录,并显示出来
2.搜索子文件夹Desktop,包含子目录,并计算出该目录一共有多少文件。(set /a a+=1会用吧?不会就算了,显示出来也行)(本题不得使用cd跳转目录!)
3.分析下列代码,并尝试制作一个 [请输入多个数字,用空格隔开,输出这些数的乘积] 计算工具
set c=1
for %%i in (2 3 5 7 11 13 17 19 23 29 31 37) do set /a c*=%%i
2016年05月26日 13点05分 4
修正 %%变量也可以是数字,从1到9排序
2016年10月21日 14点10分
修正 for中的%%变量虽是全局的,但for命令结束后会被清空
2016年10月21日 14点10分
@GUT412454 for /f结合dir[滑稽]
2017年04月22日 11点04分
@GUT412454 或者列两条命令,一条搜文件夹,一条搜文件
2017年04月22日 11点04分
level 13
2.等差数列 for /L %%变量 in (开始,间隔,结束) do (命令)
(开始,间隔,结束)表示从开始到结束的一个数列,间隔为数列差。因此,(1,2,10)将产生序列
(1 3 5 7 9),(5,-1,1)将产生序列(5 4 3 2 1)
[命令行]连续打开10个cmd窗口。
for /L %a in (1,1,10) do start cmd
[批处理]生成一个100-200的数列,间隔为5
for /L %%a in (100 5 200) do echo %%a
这个命令很简单啦,没啥解释的
作业:使用for /L命令制作一个[阶乘计算工具](10的阶乘=10*9*8*7*……*2*1)
上期答案
1. for /D %i in (*es*) do (echo %i)
2. for /R Desktop %i in (*) do set /a a+=1
3.
@echo off
:1
set /p a=请输入多个数字,用空格隔开=
set c=1
for %%i in (%a%) do set /a c*=%%i
echo %a%的乘积=%c%
goto 1
答案仅供参考,不要求完全一致。
(楼主原创出品,刚刚写的)
2016年05月26日 13点05分 5
@编程我可是第一 [滑稽]专业名词有何用?能通俗而不通俗?[喷]
2017年04月23日 23点04分
我敢保证LZ奥数不过关,真正数学定义是 首项 公差 末项
2017年04月23日 14点04分
@编程我可是第一 另外我数学全班第一[滑稽]
2017年04月23日 23点04分
@幻虚道长🍭 = =我数学全深圳40强
2017年04月26日 23点04分
level 13
上期答案
@echo off
:1
set /p a=请输入数字=
set c=1
for /L %%i in (1,1,%a%) do set /a c*=%%i
echo %a%的阶乘=%c%
goto 1
答案仅供参考,不要求完全一致。
2016年05月26日 13点05分 6
level 13
综合小节
1.批量执行/文件搜索
for  [/D]    [/R    [路径]]  %%变量  in  (集合)  do  (命令)
  文件夹 子文件夹 指定目录  单字母   搜索/文本     批量
2.等差数列
 for /L  %%变量 in  (开始,间隔,结束)  do  (命令)
等差数列 单字母    开始,间隔,结束    批量
3.文本处理
 for /F  ["选项"]  %%变量  in   (集合)   do  (命令)
文本处理  选项  单字母   搜索/"文本"/'命令'  批量
for /F "eol=! skip=n delims= -x tokens=1,7-9* usebackq" %%变量 in (集合) do (命令)
   注释   行   分隔符    列     新语法
高级用法
1.文件搜索
可以指定多个搜索目标,用空格隔开,比如这样(for命令会对每个搜索目标都搜索一遍)
for /D %i in (*es* a* Deskto?) do (echo %i)
当没有搜索到目标时,输出搜索目标。因此for也支持 集合 内容为文本
for %%i in (菜 芽 "小 公 公") do echo %%i
3.文本处理
使用goto跳转,即可实现只读取一行。
for /F "skip=3 delims=" %%i in (test.txt) do echo %%i&set a=%%i&goto 1
:1
for /F "skip=1 tokens=2 delims= " %%i in ('net user "%username%"') do set a=%%i&goto 2
:2
echo 中文用户名:%a: =%
由于for /f支持读取 命令输出,所以for不能搜索隐藏文件的缺点可以借此部分修复。
for /f "delims=" %%i in ('dibubr /ah /s/b') do attrib "%%i" -s -h -r
2016年05月26日 15点05分 8
补充 最后一句代码写错了,应为 for /f "delims=" %%i in ('dir /ah /s/b') do attrib "%%i" -s -h -r
2017年04月02日 12点04分
@幻虚道长🍭 %a: =%和%a%有什么区别啊[哈哈]
2018年09月28日 12点09分
@gggaao1 10楼自己看
2018年09月28日 14点09分
哦,应该是a中的空格去掉,哈哈
2018年09月29日 03点09分
level 9
楼主,申请加精
2016年05月28日 07点05分 9
@ echo off&echo @tmxk0411 @超人硬汉 原创求加精[咦]
2016年06月02日 10点06分
@黄田杰 原创求加精
2017年01月06日 11点01分
[泪][泪]呜呜呜,都不理我[不高兴]
2017年01月07日 04点01分
@幻虚道长🍭 我理你没用啊,我只是小吧[滑稽]
2017年01月07日 06点01分
level 13
变量扩展
大家知道,在cmd中执行for命令,变量用%i表示,而在bat中,变量用%%i表示。(这是为什么呢?学完这课大家就会懂了)
1.变量的范围
数字计算[±21 4748 3647 整数],文本[8191个字节](set /p a=<文件 和 ^换行符 可突破该限制,暂不解释)
2.变量的命名
不允许使用纯数字
不建议使用单字母变量
命名不区分大小写
3.变量扩展-文本(以下示例均以变量%a%示范,实际变量名可以为任何值)
%a:文本1=文本2% 文本1替换为文本2(文本2可留空,如%a:文本1=%)
%a:*文本1=文本2% 开头到文本1第一次出现的地方替换为文本2(文本2可留空)
%a:~10% 第10个字之后的内容
%a:~-10% 倒数第10个字之后的内容
%a:~,5% 开头之后的5个字
%a:~,-5% 倒数第5个字之前的字
%a:~10,5% 第10个字之后的5个字
%a:~10,-5% 第10个字之后,倒数第5个字之前的字
%a:~-10,5% 倒数第10个字之后的5个字
%a:~-10,-5% 倒数第10个字之后,倒数第5个字之前的字
注:文本扩展在for命令中可能不可用
示范:set a=%a:~-10,-5%
2016年06月02日 07点06分 10
level 13
4.变量扩展-延迟(在批处理开头加上一行etlocal enabledelayedexpansion即可)
@echo off
set num=10
set num=100 & echo %num%
echo %num%
echo 虽然已经将num的值更改为100,但由于没有延迟扩展,所以值仍为10,不过在下一个语句num的值就改变了
pause
@echo off
SetLocal EnableDelayedExpansion
set num=10
set num=100 & echo !num!
echo 现在两个num的值一样了(注意%num%变成了!num!)
echo %num%
pause
更复杂的写法
set q=!tem%c%!
set a=!aa:~%bb%,10!
set b=!a:%文本1%=%文本2%!
注意:延迟扩展与call的冲突
@echo off&setlocal enabledelayedexpansion
call :1
echo %a%&pause
:1
setlocal enabledelayedexpansion&echo 运行一遍,然后删除本行,再运行一遍。
set a=欢迎光临
exit /b
保留第五行,输出错误结果;删除第五行,输出正确结果 欢迎光临
结论:使用call跳转标签或文件时,需确保目标无“setlocal enabledelayedexpansion”,否则将产生错误
若必须保留setlocal enabledelayedexpansion这一行,可参考解决方案
方案1:
@ echo off
setlocal enabledelayedexpansion
call :1 1
echo %a%&pause
:1
if not #%*==# goto 2
setlocal enabledelayedexpansion
:2
set a=欢迎光临
exit /b
方案2:
@ echo off
setlocal enabledelayedexpansion
call :1
for /F "delims=" %%i in (a) do set %%i
echo %a%&pause
:1
setlocal enabledelayedexpansion
set a=欢迎光临
(set)>a
goto :eof
汇总小节
 for   [/D]   [/R   [路径]]  %%变量 in (集合)  do  (命令)
文件搜索 文件夹 子文件夹 指定目录 单字母   搜索/文本    批量
 for /L %%变量 in (开始,间隔,结束)  do  (命令)
等差数列 单字母    开始,间隔,结束     批量
 for /F ["选项"] %%变量  in    (集合)    do  (命令)
文本处理  选项  单字母   搜索/"文本"/'命令'    批量
 for /F "eol=! skip=n delims= -x tokens=1,7-9*     usebackq     "
选项   注释   行   分隔符     列    新语法("搜索"/'文本'/`命令`)
 %a:文本1=文本2% %a:~10,5% %CD% %DATE% %TIME% %RANDOM%
    替换      截取  当前目录  日期   时间    随机数
2016年06月02日 10点06分 12
修正:第一句话少了一个字母s。示例部分是正确的
2017年05月16日 13点05分
level 8
[乖][乖][乖][乖]
2016年06月02日 14点06分 14
level 9
up[真棒]
 ้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็ ้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็ ้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็  ้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็  ้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็  ้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็
2016年06月04日 00点06分 15
level 6
我知道for在c++里是循环[乖]
2016年06月04日 03点06分 16
level 8
批处理对文本的大小好像也有要求吧!太大的文件会直接不运行。还有,我用cmos的时候要是我一直不点击。cpu马上烧起来。点了就好了。用的3.0版的因为2.0读不到100多的坐标。
2016年10月26日 14点10分 17
一行不允许超过8100字
2016年10月28日 01点10分
level 13
936小程 [host]:原创求加精 @超人硬汉 @tmxk0411
2017年01月11日 00点01分 18
[滑稽][滑稽]
2017年01月15日 12点01分
level 13
写的很好 收藏了 谢谢楼主
2017年04月03日 03点04分 22
1 2 3 尾页