标题: 【练习-031】批处理代码改错 [打印本页]
作者: batman 时间: 2008-11-2 10:09 标题: 【练习-031】批处理代码改错
出题目的:
通过解题了解哪些是新手们容易忽视的地方,以减少甚至杜绝常规错误的发生
加分原则:
1、将题中的错误全部找出并改正过来加满分15分
2、少找出一处扣1分
3、未输出最后结果扣4分
题目如下:
有一错误代码如下,请将此代码中11处错误全部修改过来并输出最后结果- @echo off
- set "code=19#3 1#3 50#2 $ 1#0 3#3 20#3 $ 3#5 20#3 1#1 2#1"
- for /f "skip=1" %%i in (help) do set /a n+=1&set "_%n%=%%i"
- for /f %%a in (%code%) do (
- for /f "tokens=1,2 delims=#" %%i in (%%a) do (
- if "%%i" equ "$" (
- set /p= >nul
- ) else (
- set "str=%_%%i%"
- set /p=%str:~%%j,1%>nul
- )
- )
- 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)- @echo off
- set "code=19#3 1#3 50#2 $ 1#0 3#3 20#3 $ 3#5 20#3 1#1 2#1"
- for /f "skip=1" %%i in ('help') do set /a n+=1&call set "_%%n%%=%%i"
- for %%a in (%code%) do (
- for /f "tokens=1,2 delims=#" %%i in ("%%a") do (
- if "%%i" equ "$" (
- set /p= <nul
- ) else (
- call set "str=%%_%%i%%"
- call set /p=%%str:~%%j,1%%<nul
- )
- )
- )
- pause>nul
复制代码
[ 本帖最后由 wxcute 于 2008-11-2 18:03 编辑 ]
作者: rat 时间: 2008-11-2 19:42
- @echo off
- set "code=19#3 1#3 50#2 $ 1#0 3#3 20#3 $ 3#5 20#3 1#1 2#1"
- for /f "skip=1" %%i in ('help') do set /a n+=1&call set "_%%n%%=%%i"
- for %%a in (%code%) do (
- for /f "tokens=1,2 delims=#" %%i in ("%%a") do (
- if "%%i" equ "$" (
- set /p= <nul
- ) else (
- call set "str=%%_%%i%%"
- call set /p=%%str:~%%j,1%%<nul
- )
- )
- )
- 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
原代码如下:- @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 "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" equ "$" (
- set /p= <nul
- ) else (
- set "str=!_%%i!"
- set /p=!str:~%%j,1!<nul
- )
- )
- )
- pause>nul
复制代码
之所以启用变量延迟是因为用call会降低代码效率。
作者: keen 时间: 2009-5-26 20:42
- @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 "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" equ "$" (
- set /p= <nul
- ) else (
- set "str=!_%%i!"
- set /p=!str:~%%j,1!<nul
- )
- )
- )
- pause>nul
复制代码
结果:
YOU ARE BEST
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |