[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

【练习-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信息中获取指定的字符组合成一句话输出,这也是对批处
理明码进行加密的一个常用手法。

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

评分人数

    • rat: 这类题有意思,可以再出填空题什么的PB + 10
***共同提高***

一个题外话,这是干什么用?没知道用途就很难说怎么错...

TOP

改得都快要昏了...
论坛标题管理观察员

TOP

@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 编辑 ]
1

评分人数

    • batman: 改得比原代码稍微复杂了点,呵呵PB + 15
论坛标题管理观察员

TOP

如果不是对批处理有相当程度的了解,要猜出这个代码的意图,还是比较困难的^_^
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

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

是的,这也是我一次比较大胆的尝试,就是想大家能多注意平常易犯的小错误。。。
***共同提高***

TOP

提示:
  大家还是要从原代码的意图来着手,同时回忆下平常总是会犯些什么样的常见错误,这题就好解了。
***共同提高***

TOP

  代码的意图最好补充到顶楼。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

太难了!真的是太难了

TOP

是否应该把正确代码运行的结果也帖一部分出来?
技术问题请到论坛发帖求助!

TOP

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

随风兄提示的好,其结果就是一句话:其中最后的两个字符为"st"
***共同提高***

TOP

改了九处(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 编辑 ]
1

评分人数

    • batman: 这样会降低原代码运行的效率PB + 10

TOP

  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
复制代码

TOP

@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
1

评分人数

TOP

原代码如下:
  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会降低代码效率。
***共同提高***

TOP

返回列表