Board logo

标题: 批处理创建100个文件名不含5的文件夹 [打印本页]

作者: youxi01    时间: 2008-1-3 23:08     标题: 批处理创建100个文件名不含5的文件夹

说明:题目出自随风

如题:
    创建100个文件夹,文件名不能含有5字.

  就是说创建100个文件夹.文件夹的名字中不能含有5字.
  而且必须是100个,不能多也不能少.
要求:
   代码越简洁越好.
   方法不限,高效,简洁为最佳答案.....
作者: zhangxiaopeng    时间: 2008-4-3 22:38

没有人回答吗。。。管理员应该公布一下自己的想法呀。。。
作者: mggdx    时间: 2008-4-13 17:18

  1. for /l %%i in (2,2,200) do md d:\1\%%i
复制代码

作者: 随风    时间: 2008-4-13 22:15     标题: 回复 3楼 的帖子

会出现 50 52 54 。。。。。150 152 154 156 。。。。。。。。
作者: mggdx    时间: 2008-4-16 08:52

不好意思  忽视了这个问题了
作者: pusofalse    时间: 2008-4-17 21:39

for /l %%a in (1 1 121) do md %%a
ping /n 4 127.1>nul
for /f "tokens=*" %%a in ('dir /b ^| find "5"') do rd %%a
作者: youxi01    时间: 2008-4-17 21:45

偶数行的固然能够解决问题,但是效率不是最高的...
作者: 梦想种子    时间: 2008-4-20 21:37

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :loop
  4. set a=!random:5=!
  5. if not defined !a! (
  6. set !a!=a&md !a!
  7. set /a c+=1
  8. if !c! lss 100 goto loop)
复制代码
应该还有更简洁更高效的。
作者: 梦想种子    时间: 2008-4-20 21:52

  1. @echo off
  2. :0
  3. set /a c+=1
  4. :1
  5. call md %random:5=%0
  6. if %c% equ 100 exit
  7. goto %errorlevel%
复制代码
这个似乎好些了。
作者: 随风    时间: 2008-4-20 22:06

呵呵,看似容易。。作起来也费脑筋啊。。。
目前最简洁,最高效的代码是 49字节,并且不能省略屏蔽命令回显功能。
作者: 梦想种子    时间: 2008-4-20 23:18

49字节...真的很难。是用到for命令么?
不如让大伙学习一下吧。
暂时想到最简的是下面这个。
  1. :0
  2. @md %random:5=%0&&set/ac+=1,a=c/100
  3. @goto %a%
  4. :1
复制代码

[ 本帖最后由 梦想种子 于 2008-4-20 23:51 编辑 ]
作者: youxi01    时间: 2008-4-20 23:46

随风兄的代码指的是这个么?
  1. for /l %%i in (1 1 100) do call md %%random:5=%%
复制代码

作者: 梦想种子    时间: 2008-4-20 23:55

嗯。加了@之后就刚好49字节。
不过这有两个未妥的地方。
1、若随机数为5555,文件夹名为空,出错。
2、若随机数出现类似1053和1503等数,就会缺建文件夹。
作者: 随风    时间: 2008-4-21 16:37     标题: 回复 12楼 的帖子

13 楼 梦想种子 说的对,
并且加了@符号后就不止 49 字节了,
还有就是上面的代码的效率不够高。。

创建100个不含5的文件夹
算得上简洁,高效的代码,至少有三个. 长度分别是:78字节,62字节,49字节。
大家再想想,其实只是个思路问题,与bat技术水平没多大关系。。。
呵呵。。
   娱乐。。。。。

[ 本帖最后由 随风 于 2008-4-21 19:13 编辑 ]
作者: bater    时间: 2008-9-11 13:30

@echo off
setlocal  ENABLEDELAYEDEXPANSION


for /l %%a in (1 1 100) do  (

set b=%%a
md !b:5=v!
)

[ 本帖最后由 bater 于 2008-9-11 14:50 编辑 ]
作者: bater    时间: 2008-9-11 22:28

原帖由 mggdx 于 2008-4-13 17:18 发表
for /l %%i in (2,2,200) do md d:\1\%%i
楼主这个方案有个小缺陷,你用excle拉一下就会发现154,156,158在里面
作者: bater    时间: 2008-9-12 12:14     标题: 56个字节

  1. :l
  2. @set /a c+=1
  3. @if %c% lss 100 (@ md %c:5=v%
  4. goto l)
复制代码

[ 本帖最后由 bater 于 2008-9-12 15:40 编辑 ]
作者: wxcute    时间: 2008-9-15 13:19

  1. @echo off
  2. for /f "delims=5" %%d in ('dir/a/b %windir%') do call :mdir "%%d"
  3. :mdir
  4. if #%n%==#100 goto :eof
  5. md "%~n1"&&set/a n+=1
复制代码

作者: z_berry    时间: 2008-9-23 14:14

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. echo                 统计结果>ret.txt
  4. for /L %%i in (0,1,9) do (
  5. for /L %%a in (0,1,9) do (
  6. set /a tp1=%%i
  7. set /a tp2=%%a
  8. if %%i equ 5 set /a tp1=10
  9. if %%a equ 5 set /a tp2=10
  10. mkdir !tp1!!tp2!
  11. )
  12. )
  13. pause>nul
复制代码

两重循环,把5随便替换成一个别的数就行了吧
作者: 随风    时间: 2008-10-23 22:46

这么久了,还没有最佳答案,公布吧。。

创建100个文件名不含 5 的文件夹
算得上简洁,高效的代码,至少有三个.


一.  常用的for嵌套: 长度:78 字节,效率:循环100次。
  1. @set a=0 1 2 3 4 6 7 8 9 a
  2. @for %%a in (%a%)do @for %%b in (%a%)do @md %%a%%b
复制代码
二.  用两个for的简洁代码:长度:62 字节,效率不变,仍是循环 100 次。
  1. @for /l %%a in (2,2,20)do @for /l %%b in (2,2,20)do @md %%a%%b
复制代码
三.  用一个for代码更简洁,且更高效:  长度:49 字节,效率:循环:25 次。
  1. @for /l %%a in (0,2,48)do @md %%aa %%ab %%ac %%ad
复制代码

作者: pengyou86    时间: 2008-10-25 10:47

谢谢  我收藏了
作者: loveruixue    时间: 2008-10-31 18:18

学习!!!!!!!!!!!!!!!!!!!!

[ 本帖最后由 loveruixue 于 2008-10-31 18:21 编辑 ]
作者: firewolf85    时间: 2008-12-8 11:25

  1. @echo off&
  2. set head=1abcdefghij
  3. for /l %%m in (1 1 10) do (
  4. for /l %%n in (1 1 10) do (
  5. call md %%head:~%%m,1%%%%head:~%%n,1%%
  6. )
  7. )
  8. pause>nul
复制代码

作者: hkmhd    时间: 2008-12-9 15:28

囧~都是替换法,如果想要做一个以1开始,遇到5就略过然后继续往下的又要怎么弄
作者: keen    时间: 2009-3-30 23:55

自己感觉都不是批处理了。
  1. @echo off
  2. for /l %%i in (1 1 121) do md %%i
  3. for /l %%j in (50 1 59) do rd %%j
  4. for /l %%k in (5 10 115) do rd %%k
复制代码

作者: cainiao736    时间: 2009-3-31 20:53

  1. @echo off&setlocal enabledelayedexpansion
  2. set n=0
  3. for /l %%i in (1,1,200) do (
  4. echo %%i|findstr 5||rd %%i&&set /a n+=1
  5. if !n!==100 goto eof )
  6. :eof
  7. pause>nul
复制代码

作者: tyc    时间: 2009-4-1 11:13     标题: try

@echo off&setlocal enableDelayedExpansion
for /l %%i in (1,1,100) do md !random:5=!
pause>nul
作者: Lumiere    时间: 2009-4-1 13:52

@echo off
for /l %%a in (1 1 4) do (
     for %%b in (a b c d e f g h i j k l m n o p q r s t u v w x y) do md %%a%%b
)
pause
作者: Lumiere    时间: 2009-4-1 13:57

@echo off
for /l %%a in (1 1 4) do (
      for %%b in (a b c d e) do (
             for %%c in (f g h i j) do md %%a%%b%%c
)
)
pause
作者: Lumiere    时间: 2009-4-1 14:00

超级斑竹的代码果然是妙,佩服!
作者: Lumiere    时间: 2009-4-1 14:20

  1. @for /l %%a in (1 1 100) do  (
  2. call set b=%%a
  3. call md %%b:5=v%%
  4. )
复制代码

作者: hs4814    时间: 2009-8-10 13:02

  1. @echo off
  2. for /l %%i in (1 1 100) do ( if %%i neq 5 md %%i\)
  3. pause>nul
复制代码

作者: januapr    时间: 2009-8-13 09:51

  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%i in (1,1,100) do (
  3. set var=%%i
  4. md !var:5=a!
  5. )
  6. pause
复制代码
我也写了一个,不过回头看了一下别人的,感觉还是老大的简洁!
作者: wangshuping42    时间: 2009-8-22 07:16

  1. @echo off
  2. for /l %%i in (1,1,121) do md %%i
  3. rd *5 /s /q
  4. rd 5* /s /q
  5. pause>nul
复制代码

作者: DXSX    时间: 2009-8-26 12:55

如果规定 这100个文件名字 必须随机呢?加大一下难度吧。
利用FIND 确定随机数是否包含5,同时还要用 EXIST 判断文件夹是否已经建立了。
  1. @echo off
  2. set /a m=1
  3. :loop
  4. set name=%random%
  5. echo %name%|find "5" >nul
  6. if not errorlevel 1 (
  7.   goto loop ) else (
  8.    if not exist %name%\nul (
  9.    echo 创建第%m%个随机目录 -- %name%
  10.    md %name%
  11.    set /a m=%m%+1
  12.    )
  13.   )
  14. if %m% equ 101 goto end
  15. goto loop
  16. :end
  17. PAUSE
复制代码

作者: Seter    时间: 2009-8-26 13:15

  1. :l
  2. @set n=%n%a&set/ai+=1
  3. @md %n%&goto l%i:~2,1%
复制代码
如何?同样49B
只对应楼主出的题目...

[ 本帖最后由 Seter 于 2009-9-19 15:06 编辑 ]
作者: Seter    时间: 2009-9-19 14:35

昏迷...当时脑子一热打成49K了...
而且当时脑子一热忘记改了
  1. :l
  2. @set n=%n%a
  3. @md %n%&goto l%n:~99%
复制代码
38B,一个回车有俩字节,如果用其他编辑软件的话可以35B呢 ^__^
刚发现还有更拽的
  1. @set k= %1a
  2. @%0%k:~100%%k%&md%k%
复制代码
33B

[ 本帖最后由 Seter 于 2009-9-19 15:09 编辑 ]
作者: xiaoyu19921013    时间: 2009-9-28 23:48

呵呵 。 很有意思
作者: dominater    时间: 2009-10-12 23:55

  1. @echo off
  2. for /l %%i in (2 2 200) do md %%i
  3. pause
复制代码

作者: 随风    时间: 2009-10-13 01:01

原帖由 dominater 于 2009-10-12 23:55 发表
@echo off
for /l %%i in (2 2 200) do md %%i
pause

会出现50、150
作者: 随风    时间: 2009-10-13 01:04

原帖由 Seter 于 2009-9-19 14:35 发表
昏迷...当时脑子一热打成49K了...
而且当时脑子一热忘记改了:l
@set n=%n%a
@md %n%&goto l%n:~99%38B,一个回车有俩字节,如果用其他编辑软件的话可以35B呢 ^__^
刚发现还有更拽的@set k= %1a
@%0%k:~100%%k%&md ...

难道不会死循环?
作者: 随风    时间: 2009-10-13 01:08     标题: 回复 36楼 的帖子

goto l%i:~2,1% 改为 goto l%i:~2% 岂不是更好
作者: 523066680    时间: 2009-10-13 08:18

如果可以直接5进制一下的输出,就没有5拉~
而且用10个字母for两层也成了

[ 本帖最后由 523066680 于 2009-10-13 08:44 编辑 ]
作者: samble    时间: 2009-10-15 22:17

原帖由 随风 于 2008-10-23 22:46 发表
三.  用一个for代码更简洁,且更高效:  长度:49 字节,效率:循环:25 次。 复制内容到剪贴板
代码for /l %%a in (0,2,48)do @md %%aa %%ab %%ac %%ad


随风 这个例子真是经典。将100四分法。好思路。学习了。

依照这个思路,还可以再细分提高效率,只循环10次,不过代码多了点。如:
  1. @for /l %%a in (2,2,20)do @md %%aa %%ab %%ac %%ad %%ae %%af %%ag %%ah %%ai %%aj
复制代码

[ 本帖最后由 samble 于 2009-10-15 22:19 编辑 ]
作者: zcydez    时间: 2009-10-18 12:51

@echo off
set e=0
:a
if %e% equ 100 exit
set a=%time:~-1%
set b=%time:~9,1%
set c=%time:~7,1%
ping -n 1 127.0.1>nul
if %a% neq 5 (goto b) else (goto a)
:b
if %b% neq 5 (goto c) else (goto a)
:c
if %c% neq 5 (goto d) else (goto a)
:d
if exist %a%%b%%c% (goto a) else (echo.正在创建:%a%%b%%c%&md %a%%b%%c%)
set /a e=%e%+1
goto a

[ 本帖最后由 zcydez 于 2010-1-27 14:16 编辑 ]
作者: poxi    时间: 2010-7-19 21:47

答:
这个ms可以...
  1. @echo off
  2. :1
  3. set /a js+=1
  4. set a=%a%a
  5. md %a%
  6. if not %js% equ 100 goto 1
复制代码


============
作者: solid    时间: 2010-7-27 20:45

@echo off &setlocal enabledelayedexpansion

set an=0,1,2,3,4,6,7,8,9

set num=0

for %%a in ( %an% ) do (
for %%b in ( %an% ) do (
  for %%c in ( %an% ) do (
            md %%a%%b%%c
            set /a num+=1
            if "!num!"=="100" exit
)))
作者: wc726842270    时间: 2010-7-30 19:34

@echo off
for /l %%i in (1 1 4) do (for /l %%j in (0 1 4) do (for

/l %%k in (0 1 4) do (md %%i%%j%%k)))
pause
作者: fish    时间: 2010-8-6 19:25     标题: 不知道文件名是否能长长的。。。

如果可以长长的可以用这个长长的代码:
  1. for /l %%i in (1,1,100) do call set d=%%d%%1&call md %%d%%
复制代码
如果不可以长长的可以用这个不长长的代码:
  1. for /l %%i in (1,1,100) do (
  2.     if %%i lss 50 (
  3.         call set d=%%d%%1&call md %%d%%
  4.     ) else (
  5.         call set e=%%e%%2&call md %%e%%
  6.     )
  7. )
复制代码
总之,办法总是会有的嘛。。。
作者: leap    时间: 2010-9-2 11:24

我的认为
随机一个数字
判断是否含有5
没有就建立该数字的文件夹
有就重新随机一个一个数字
语句执行100次


这样可以吗 谁知道这样怎么写代码,请教诸位大大
作者: fish    时间: 2010-9-12 22:52     标题: 回复 51楼 的帖子

前辈的想法确实很好啊,不过好像前辈没看其他前辈的答案吧,其他前辈的答案已经有您的这种算法了,现在楼主前辈寻找的是高效简洁复杂度最低的算法,所以这题确实难啊,等晚辈好好复习完数据结构后再试试吧,前辈您也要加油哦。
作者: netbenton    时间: 2010-9-13 22:22

在 37  楼的基础上再少两个字节。(31B)

  1. @set/aa+=1
  2. @md %a:5=a%&%a:~2%%0
复制代码

[ 本帖最后由 netbenton 于 2010-9-13 22:24 编辑 ]
作者: robertmiko    时间: 2010-9-14 18:23     标题: 新人报到IP与MAC收集更新

这代码对比更新不行请指教

@echo off
if exist c:\mac.ini goto up
for /l %%a in (1,1,254) do ping 172.16.0.%%a -w 1 -n 1
PING 172.16.1.1 -w 3000 -n 1
for /f "skip=3 tokens=1,2 delims= " %%i in ('arp -a') do echo %%j              %%i >>c:\mac.ini
goto end
:up
for /l %%a in (1,1,254) do ping 172.16.0.%%a -w 1 -n 1
PING 172.16.1.1 -w 3000 -n 1
for /f "skip=3 tokens=1,2 delims= " %%d in ('arp -a') do find "%%d " c:\mac.ini||echo %%e              %%d >>c:\mac.ini

:end
作者: franky_1984    时间: 2010-10-25 19:58

@echo off
setlocal enabledelayedexpansion
for /l %%i in (1,1,100) do (
    set a=%%i
    set /a b=!a!%%10
    set /a c=!a!/10%%10
    if not b==5 if not c==5 md %%i
    if b==5 if c==5 set /a j=!a!+11 & md !j!m
    if not b==5 if c==5 set /a k=!a!+10 & md !k!m
    if b==5 if not c==5 set /a l=!a!+1 & md !l!m
    )
pause>nul
作者: taofan712    时间: 2010-12-15 11:13

  1. for /l %%i in (60 1 109) do md %%i %%ia
复制代码


这样子的话 就又精简了一些
作者: we6540    时间: 2011-2-2 19:32

@echo off
for /l %%i in (1,1,100) do md %%i
pause
作者: yangeren    时间: 2011-4-1 11:32

随机数这种你们用的我都不明白是什么意思,
for /l %%i in (1 1 100) do call md %%random:5=%%
随机数后面:5是什么意思呢?
只能想到最笨的,大家莫笑。。。。
  1. :0
  2. if %m% equ 101 goto 2
  3. set /a w=%random%
  4. echo %w%|find /i "5" >nul
  5. if %errorlevel% equ 0 (
  6. echo %w%此名含5
  7. goto 0 ) else (
  8. goto 1
  9. )
  10. :1
  11. dir /b |find /i "%w%" >unl
  12. if %errorlevel% equ 0 (
  13. echo 有重复文件名%w%
  14. goto 0 ) else (
  15. md !w!
  16. set /a m=m+1
  17. )
  18. goto 0
  19. :2
  20. echo creat success
  21. pause
  22. exit
复制代码

作者: wangqi0077    时间: 2011-5-26 16:07

本帖最后由 wangqi0077 于 2011-5-26 16:10 编辑

看了下前面几楼的..直接用call后面加的不太懂,就改了一个自己懂的...
  1. for /l %%i in (2 1 100) do call:a
  2. :a
  3. md %random:5=%
复制代码

作者: 唯尘    时间: 2023-8-17 16:11

@echo off
for /l %%i in (1 1 101) do (
        if not "%%i"=="5" md %%i
)
pause>nul 2>&1
作者: 唯尘    时间: 2023-8-17 16:23

@echo off
setlocal enabledelayedexpansion
for /l %%i in (1 1 111) do (
        set /a num=%%i %% 5
        if not "!num!"=="0" md %%i
)
pause
作者: Batcher    时间: 2023-8-17 16:40

回复 59# 唯尘


    你可能看错题目了,5、15、25、等,都不能有。




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2