找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 37714|回复: 15

【练习-031】批处理代码改错

[复制链接]
发表于 2008-11-2 10:09:16 | 显示全部楼层 |阅读模式
出题目的:
     通过解题了解哪些是新手们容易忽视的地方,以减少甚至杜绝常规错误的发生
加分原则:
  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信息中获取指定的字符组合成一句话输出,这也是对批处
理明码进行加密的一个常用手法。

为给更多的会员留下思考的机会,特先将已经贴出的代码屏蔽,也请被屏蔽的会员谅解了。

评分

参与人数 1PB +10 收起 理由
rat + 10 这类题有意思,可以再出填空题什么的

查看全部评分

发表于 2008-11-2 10:30:45 | 显示全部楼层
一个题外话,这是干什么用?没知道用途就很难说怎么错...
发表于 2008-11-2 10:32:43 | 显示全部楼层
改得都快要昏了...
发表于 2008-11-2 11:07:05 | 显示全部楼层
@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 编辑 ]

评分

参与人数 1PB +15 收起 理由
batman + 15 改得比原代码稍微复杂了点,呵呵

查看全部评分

发表于 2008-11-2 11:53:15 | 显示全部楼层
如果不是对批处理有相当程度的了解,要猜出这个代码的意图,还是比较困难的^_^
 楼主| 发表于 2008-11-2 12:13:25 | 显示全部楼层
原帖由 Batcher 于 2008-11-2 11:53 发表
如果不是对批处理有相当程度的了解,要猜出这个代码的意图,还是比较困难的^_^

是的,这也是我一次比较大胆的尝试,就是想大家能多注意平常易犯的小错误。。。
 楼主| 发表于 2008-11-2 12:18:21 | 显示全部楼层
提示:
  大家还是要从原代码的意图来着手,同时回忆下平常总是会犯些什么样的常见错误,这题就好解了。
发表于 2008-11-2 12:59:33 | 显示全部楼层
  代码的意图最好补充到顶楼。
发表于 2008-11-2 13:33:26 | 显示全部楼层
太难了!真的是太难了
发表于 2008-11-2 17:45:15 | 显示全部楼层
是否应该把正确代码运行的结果也帖一部分出来?
 楼主| 发表于 2008-11-2 17:49:48 | 显示全部楼层
原帖由 随风 于 2008-11-2 17:45 发表
是否应该把正确代码运行的结果也帖一部分出来?

随风兄提示的好,其结果就是一句话:其中最后的两个字符为"st"
发表于 2008-11-2 18:01:24 | 显示全部楼层
改了九处(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 编辑 ]

评分

参与人数 1PB +10 收起 理由
batman + 10 这样会降低原代码运行的效率

查看全部评分

发表于 2008-11-2 19:42:48 | 显示全部楼层
  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
复制代码
发表于 2008-11-3 16:52:08 | 显示全部楼层
@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

评分

参与人数 1PB +11 收起 理由
yslyxqysl + 11 结果?

查看全部评分

 楼主| 发表于 2008-11-7 15:12:17 | 显示全部楼层
原代码如下:
  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会降低代码效率。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 22:03 , Processed in 0.021852 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表