Board logo

标题: 【练习-031】批处理代码改错 [打印本页]

作者: batman    时间: 2008-11-2 10:09     标题: 【练习-031】批处理代码改错

出题目的:
     通过解题了解哪些是新手们容易忽视的地方,以减少甚至杜绝常规错误的发生
加分原则:
  1、将题中的错误全部找出并改正过来加满分15分
  2、少找出一处扣1分
  3、未输出最后结果扣4分
题目如下:
  有一错误代码如下,请将此代码中11处错误全部修改过来并输出最后结果
  1. @echo off
  2. set "code=19#3 1#3 50#2 $ 1#0 3#3 20#3 $ 3#5 20#3 1#1 2#1"
  3. for /f "skip=1" %%i in (help) do set /a n+=1&set "_%n%=%%i"
  4. for /f %%a in (%code%) do (
  5.     for /f "tokens=1,2 delims=#" %%i in (%%a) do (
  6.         if "%%i" equ "$" (
  7.            set /p= >nul
  8.            ) else (
  9.            set "str=%_%%i%"
  10.            set /p=%str:~%%j,1%>nul
  11.      )
  12. )
  13. pause>nul
复制代码
个人要求:
  请版主们先将此题留给会员们思考。。。
多谢namejm提醒,补充下原代码的意图:
  原正确代码就是要在系统help信息中获取指定的字符组合成一句话输出,这也是对批处
理明码进行加密的一个常用手法。

为给更多的会员留下思考的机会,特先将已经贴出的代码屏蔽,也请被屏蔽的会员谅解了。
作者: BBCC    时间: 2008-11-2 10:30

一个题外话,这是干什么用?没知道用途就很难说怎么错...
作者: yslyxqysl    时间: 2008-11-2 10:32

改得都快要昏了...
作者: yslyxqysl    时间: 2008-11-2 11:07

@echo off
setlocal ENABLEDELAYEDEXPANSION
set "code=19#3 1#3 50#2 $ 1#0 3#3 20#3 $ 3#5 20#3 1#1 2#1"
for /f "usebackq skip=1" %%i in (`help`) do set /a n+=1&set "_!n!=%%i"
for /f %%a in (%code%) do
^
for /f "usebackq tokens=1,2 delims=#" %%i in (`echo %%a`) do (
if "%%i"
equ "$" (
set /p=
<nul
) else (

set "str=!_%%i!"
set /p=!str:~%%j^,1!<nul
) )
pause>nul

为增、改,为删
结果:YOU ARE BEST

[ 本帖最后由 yslyxqysl 于 2008-11-2 17:41 编辑 ]
作者: Batcher    时间: 2008-11-2 11:53

如果不是对批处理有相当程度的了解,要猜出这个代码的意图,还是比较困难的^_^
作者: batman    时间: 2008-11-2 12:13

原帖由 Batcher 于 2008-11-2 11:53 发表
如果不是对批处理有相当程度的了解,要猜出这个代码的意图,还是比较困难的^_^

是的,这也是我一次比较大胆的尝试,就是想大家能多注意平常易犯的小错误。。。
作者: batman    时间: 2008-11-2 12:18

提示:
  大家还是要从原代码的意图来着手,同时回忆下平常总是会犯些什么样的常见错误,这题就好解了。
作者: namejm    时间: 2008-11-2 12:59

  代码的意图最好补充到顶楼。
作者: make    时间: 2008-11-2 13:33

太难了!真的是太难了
作者: 随风    时间: 2008-11-2 17:45

是否应该把正确代码运行的结果也帖一部分出来?
作者: batman    时间: 2008-11-2 17:49

原帖由 随风 于 2008-11-2 17:45 发表
是否应该把正确代码运行的结果也帖一部分出来?

随风兄提示的好,其结果就是一句话:其中最后的两个字符为"st"
作者: wxcute    时间: 2008-11-2 18:01

改了九处(YOU ARE BEST)
  1. @echo off
  2. set "code=19#3 1#3 50#2 $ 1#0 3#3 20#3 $ 3#5 20#3 1#1 2#1"
  3. for /f "skip=1" %%i in ('help') do set /a n+=1&call set "_%%n%%=%%i"
  4. for %%a in (%code%) do (
  5.     for /f "tokens=1,2 delims=#" %%i in ("%%a") do (
  6.         if "%%i" equ "$" (
  7.            set /p= <nul
  8.            ) else (
  9.            call set "str=%%_%%i%%"
  10.            call set /p=%%str:~%%j,1%%<nul
  11. )
  12.      )
  13. )
  14. pause>nul
复制代码


[ 本帖最后由 wxcute 于 2008-11-2 18:03 编辑 ]
作者: rat    时间: 2008-11-2 19:42

  1. @echo off
  2. set "code=19#3 1#3 50#2 $ 1#0 3#3 20#3 $ 3#5 20#3 1#1 2#1"
  3. for /f "skip=1" %%i in ('help') do set /a n+=1&call set "_%%n%%=%%i"
  4. for %%a in (%code%) do (
  5.     for /f "tokens=1,2 delims=#" %%i in ("%%a") do (
  6.         if "%%i" equ "$" (
  7.            set /p= <nul
  8.            ) else (
  9.            call set "str=%%_%%i%%"
  10.            call set /p=%%str:~%%j,1%%<nul
  11. )
  12.      )
  13. )
  14. pause>nul
复制代码

作者: mingming1205    时间: 2008-11-3 16:52

@echo off
set "code=19#3 1#3 50#2 $ 1#0 3#3 20#3 $ 3#5 20#3 1#1 2#1"
setlocal enabledelayedexpansion
for /f "skip=1" %%i in ('help') do (
set /a n+=1
set "_!n!=%%i"
)
for %%a in (%code%) do (
    for /f "tokens=1,2 delims=#" %%i in ("%%a") do (
        if "%%i"=="$" (
           set /p= <nul
           ) else (
set "str=!_%%i!"
set "var=%%j"
set /p=!str:~%%j,1!<nul
           
     )
)
)
pause>nul
作者: batman    时间: 2008-11-7 15:12

原代码如下:
  1. @echo off&setlocal enabledelayedexpansion
  2. set "code=19#3 1#3 50#2 $ 1#0 3#3 20#3 $ 3#5 20#3 1#1 2#1"
  3. for /f "skip=1" %%i in ('help') do set /a n+=1& set "_!n!=%%i"
  4. for %%a in (%code%) do (
  5.     for /f "tokens=1,2 delims=#" %%i in ("%%a") do (
  6.         if "%%i" equ "$" (
  7.            set /p= <nul
  8.            ) else (
  9.            set "str=!_%%i!"
  10.            set /p=!str:~%%j,1!<nul
  11.         )
  12.      )
  13. )
  14. pause>nul
复制代码
之所以启用变量延迟是因为用call会降低代码效率。
作者: keen    时间: 2009-5-26 20:42

  1. @echo off&setlocal enabledelayedexpansion
  2. set "code=19#3 1#3 50#2 $ 1#0 3#3 20#3 $ 3#5 20#3 1#1 2#1"
  3. for /f "skip=1" %%i in ('help') do set /a n+=1&set "_!n!=%%i"
  4. for %%a in (%code%) do (
  5.     for /f "tokens=1,2 delims=#" %%i in ("%%a") do (
  6.         if "%%i" equ "$" (
  7.            set /p= <nul
  8.            ) else (
  9.            set "str=!_%%i!"
  10.            set /p=!str:~%%j,1!<nul
  11.            )
  12.      )
  13. )
  14. pause>nul
复制代码
结果:
YOU ARE BEST




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