无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
楼主: 鹤冲天
打印 上一主题 下一主题

那位老师有些批处理的实例能否贴出来让偶等小鸟学习学习!

[复制链接]
31#
发表于 2006-12-12 10:57:40 | 只看该作者
太厉害了,这样的细节很少有资料说到
回复

使用道具 举报

32#
发表于 2006-12-12 11:14:09 | 只看该作者
请问一下有些变量使用是%i有些却是%i%或!i!,有什么区别吗?

for /f %%a in (说明.txt) do echo %%a此句在批处理中执行正确,而在命令行下却提示”此时不应有 %%a。“
改为for /f %a in (说明.txt) do echo %a在命令行下正确执行为何?
回复

使用道具 举报

33#
发表于 2006-12-12 11:29:50 | 只看该作者
  如果用在批处理文件中,for 语句中的 %%a 要用两个百分号,在CMD命令行中只能用一个百分号,这是for语句的一个规定。
回复

使用道具 举报

34#
 楼主| 发表于 2006-12-15 21:40:54 | 只看该作者
echo.
echo:
echo;
我在测试中看到的都是空一行!
他们具体的含义是什么啊?还有其他用法吗?
对了,namejm老师如果有机会到石家庄一定通知我啊!让我有机会略进地主之仪表表心仪!!
回复

使用道具 举报

35#
发表于 2006-12-16 00:00:17 | 只看该作者
  如果它们后面不跟任何字符的话,它们的作用就是产生一个空行。在排版的时候非常有用。

  另外,它们的使用还有些技巧。比如在批处理中,假设你要在屏幕上显示一个变量的值的话,按照一般的写法,写成 echo %var%,如果这个变量恰好是个空值的话,就会显示当前 echo 的状态,而不是一个空值。为了回避这个干扰信息,可以写成 echo.%var% 的形式(注意:一定要连着写,中间不带任何空格),或者 echo:%var%,或者 echo;%var%,则碰到空值的时候,会自动空一行;碰到有内容的时候,会正确显示内容而不会产生多余的空行。

  感谢你的盛情邀请,有机会到石家庄的话,我一定去骚扰你^_^。若你有机会来成都的话,也别忘了和我联系:)
回复

使用道具 举报

36#
 楼主| 发表于 2006-12-18 11:50:03 | 只看该作者
bag.bat
@echo off
setlocal enabledelayedexpansion
set mm=%1
set /p start=输入每行开头要添加的字符串:
set /p end=输入每行结为要添加的字符串:
for /f "tokens=1,2* delims=:" %%i in ('findstr /n . %mm%') do echo ^!start^!%%j^!end^! >>22.txt
endlocal

pause
这个大概知道是怎么回事,但具体的一些地方看不太懂!
setlocal enabledelayedexpansion这个ms的解释是启动或停用延缓环境变量扩展名。
可我不是很理解这句话的意思!
在有什么是命令扩展名??扩展名?想不明白是什么意思?
在有他具体起到什么作用?启动延缓??不明白?
for /f "tokens=1,2* delims=:" %%i in ('findstr /n . %mm%') do echo ^!start^!%%j^!end^! >>22.txt
这句中findstr/n        ms的解释是/N        在匹配的每行前打印行数。(我没看到打印行数啊)
还有后面那个.是做什么用的?
echo ^!start^!%%j^!end^!   
在这里^这个符号是转义符号吗?转义符号是做什么用的?我去掉它也能用啊!!
还有%%j是做什么的?我在代码里看不到他的定义啊!
回复

使用道具 举报

37#
发表于 2006-12-18 13:45:19 | 只看该作者
  关于启用变量延缓的详细解释,可以参考这个帖子:http://www.cn-dos.net/forum/viewthread.php?tid=20733&fpage=2。

  findstr /n 打印了行数而你却没看到,是因为在 echo 的时候,就没让它显示出来,这与前面的设置及后面的 echo 语句有关系。假设你的 test.txt 中存在若干行信息,运行如下批处理代码来观察屏幕显示:

  1. @echo off
  2. findstr /n *. test.txt
  3. pause
复制代码

  你看到了什么?是不是以 行号:行内容 的格式显示的?
  
  回到你的疑问中来:for /f "tokens=1,2* delims=:"  这部分的含义是:以冒号为分隔符,提取第一、二个冒号前的内容及第二个冒号后的所有内容(不考虑几个冒号连用的情况),第一个冒号前的内容被 %%i 接收,第二个冒号前的内容被 %%j 接收,剩余的所有内容被 %%k 接收,%%j 和 %%k 分别被 tokens= 这个部分的 2 和 * 定义;findstr .* 中的点号表示任意非空字符,.*连用表示任意字符(包括空字符)。

  转义字符的作用是取消某些符号的原有功能,把它们转化成一般的字符,主要为了处理重定向符号和管道符号。把这个功能用到其他场合,也会有意想不到的效果。比如,在命令行里,你运行 echo > 会提示你语法错误,运行 echo ^> 之后,就会在屏幕上显示字符 > 了,在这里,^ 把 重定向符号 > 转化成普通字符了。实际上,把所有要显示的内容之前加上^,都会显示原本的内容而不显示 ^。
回复

使用道具 举报

38#
 楼主| 发表于 2006-12-23 20:00:20 | 只看该作者
@echo off
for /r %%i in (*.bat) do call :bagpipe "%%i"(这段代码是做什么的我大概明白,但我要解释它如何解释呢??)
cls
echo;
echo:
echo.
echo           懒懒的阳光懒懒的爬进窗... ...
goto :eof(:eof?这是什么??跳转到eof!可我没看到它啊!?)


:bagpipe
echo %1
pause 1>nul

pause
回复

使用道具 举报

39#
发表于 2006-12-23 22:09:56 | 只看该作者
  如果 goto :eof 不在被 call 的标签段中,并且没有 :eof 标签段的话,那么,goto :eof 等价于 exit 命令;如果它在某个被 call 的标签段中,并且没有定义 :eof 标签段,那么,它的意思就是跳转到批处理文件的末尾。
回复

使用道具 举报

40#
发表于 2006-12-25 09:06:45 | 只看该作者
晕了
谢谢上边的讨论
回复

使用道具 举报

41#
 楼主| 发表于 2006-12-25 14:28:50 | 只看该作者
晕,怎么把这精华帖算到偶头上了??偶何德何能??岂敢在这里妄自尊大!
强烈建议斑竹将此精华帖算到nemejm老师名下!!
回复

使用道具 举报

42#
发表于 2006-12-25 14:49:47 | 只看该作者
学习了!!!!
回复

使用道具 举报

43#
发表于 2006-12-25 16:20:21 | 只看该作者
原帖由 鹤冲天 于 2006-12-25 02:28 PM 发表
晕,怎么把这精华帖算到偶头上了??偶何德何能??岂敢在这里妄自尊大!
强烈建议斑竹将此精华帖算到nemejm老师名下!!

  加精的目的是让更多的人来关注,能达到这个目的我就很高兴了,至于精华算在谁的名下,对我来说不是很重要。再说,你发起了这个讨论,并且一直在关注它,版主也应该奖励一下你啊:P
回复

使用道具 举报

44#
发表于 2006-12-25 23:55:29 | 只看该作者
正如namejm朋友所言。首先,楼主你的学习精神值得我学习,其次namejm朋友的无私精神更值得我们学习,关注这一帖,我们能明白更多的东西,所以我把这一帖加精了。

如果这一帖因为加精了而影响了两位朋友的继续讨论的话,我愿意取消此帖的加精。
回复

使用道具 举报

45#
发表于 2006-12-26 00:09:07 | 只看该作者
  加精不会影响继续讨论哈,反倒能吸引更多的人来参与讨论,更能推动讨论往深入的方向发展,楼主就别计较那么多了。
回复

使用道具 举报

46#
 楼主| 发表于 2006-12-26 10:21:40 | 只看该作者
呵呵,影响讨论那是不可能的!(我脸皮多厚啊!:lol)名利本是过眼之烟云,偶本无意(也无力)争取!
偶在浩瀚的internet海洋中,挣扎了进10年!今日方知论坛之“真正”魅力!!在这虚拟的世界中有namejm老师和无优众热心网友能成为偶的良师益友此生足以!
此帖精华偶姑且厚着脸皮收下!希望我能尽快掌握这些知识把谈论引入深处(别总是问点白痴问题!:L!!)
也不枉namejm老师和6618斑竹对偶的帮助和厚爱!!
如有言语不当之处请各位多多海涵!!
回复

使用道具 举报

47#
 楼主| 发表于 2006-12-27 14:28:09 | 只看该作者
在我某个文件夹下有个EXE文件,我应如何准确获知它的路径,并将其添加到注册表[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]键值下,跟随系统一同启动!?
回复

使用道具 举报

48#
发表于 2006-12-27 17:12:37 | 只看该作者
假设你要找的程序为a.exe,代码如下:

  1. :: code by ccwan CMD@XP
  2. @echo off
  3. for /d %%i in (c d e f g h) do (
  4.       for /f "delims=" %%i in ('dir /a-d/s/b %%i:\a.exe') do (
  5.           set var=%%~fi
  6.       )
  7. ) 2>nul
  8. reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v a.exe /t reg_sz /d %var% /f
复制代码
回复

使用道具 举报

49#
 楼主| 发表于 2006-12-27 20:13:11 | 只看该作者
在我这里运行出错!
打开了注册表,添加了个键值,但没有内容!
而且运行时间很长!!
不知道是我那里弄错了!?1
回复

使用道具 举报

50#
 楼主| 发表于 2006-12-27 20:25:59 | 只看该作者
我胡写了一个,别笑话我啊!!
能得到详细的路径,但不能添加到注册表!
下面以添加tree.txt为例:
@echo off
echo Windows Registry Editor Version 5.00 >c:\1.reg
echo. >>c:\1.reg
echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]>>c:\1.reg
echo "KAV"="%~dp0tree.txt">>c:\1.reg
regedit /s c:\1.reg
del /q /f c:\1.reg

这样得到的注册表格式是
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
"KAV"="F:\My Virtual Machines\共享\DOS实例练习\DOS实例练习\tree.txt"

这样的信息添加是失败的!
要是能得到这样的信息就能成功"KAV"="F:\\My Virtual Machines\\共享\\DOS实例练习\\DOS实例练习\\tree.txt"我如何才能得到这样的信息??!
回复

使用道具 举报

51#
发表于 2006-12-27 21:47:09 | 只看该作者
  要把路径中的单斜杠换成双斜杠,可以参考如下演示代码:

  1. @echo off
  2. set "var=%cd%"
  3. set "str=%var:\=\\%"
  4. echo "%str%"
  5. pause
复制代码
回复

使用道具 举报

52#
发表于 2006-12-28 08:10:14 | 只看该作者
不知道鹤冲天兄所说的时间很长有多长?我这里几秒而已。这可是全盘搜索啊。
至于键值没有内容,我想问你要找的程序是什么,在那个盘里?有几个呢?
回复

使用道具 举报

53#
 楼主| 发表于 2006-12-28 10:19:04 | 只看该作者
原帖由 ccwan 于 2006-12-28 08:10 AM 发表
不知道鹤冲天兄所说的时间很长有多长?我这里几秒而已。这可是全盘搜索啊。
至于键值没有内容,我想问你要找的程序是什么,在那个盘里?有几个呢?

哦,在我这里大概有10-20秒左右吧!呵呵,这应该是我的机器比较垃圾的过!
键值的确没有内容,我就以你所假设的a.exe来试的,文件和P处理在一个目录下!
我P处理水平很差,好多P我看不懂,只能是边试验边看代码,来了解代码的内容!
其实我的目的很简单,前几天从坛子里下了个咔吧3.5绿色版,但它并不自启动,所以我想弄个P,把它加到RUN里!
回复

使用道具 举报

54#
发表于 2006-12-28 10:33:26 | 只看该作者
呵呵,其实用dir本来就效率低,这也难怪的。
至于键值的确没有内容,我想是否路径中有空格呢?
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v a.exe /t reg_sz /d “%var%” /f
%var%加上引号兄再试试看好吗?
回复

使用道具 举报

55#
发表于 2006-12-28 16:06:44 | 只看该作者
SC.bat

@echo off
cls
echo.
echo starting... ...

echo e 0100 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00>>tvis
中间省略
echo e 7AF0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00>>tvis
echo rcx>>tvis
echo 7A00>>tvis
echo n tvisGRAY>>tvis
echo w>>tvis
echo q>>tvis
debug<tvis>nul

del tvis
ren tvisGRAY sc1.exe
echo Finished!!!
pause


好像将某的程序的16进制的码写到tvis,后面的命令好像是编译他

能具体说说红色部分的意义吗,不知该部分通用吗

[ 本帖最后由 沙漠之子 于 2006-12-28 04:08 PM 编辑 ]
回复

使用道具 举报

56#
发表于 2006-12-28 16:17:34 | 只看该作者
  红色部分是汇编代码,我也不知道确切含义,请高人出来解释一下吧。
回复

使用道具 举报

57#
 楼主| 发表于 2006-12-28 21:52:01 | 只看该作者
原帖由 ccwan 于 2006-12-28 10:33 AM 发表
呵呵,其实用dir本来就效率低,这也难怪的。
至于键值的确没有内容,我想是否路径中有空格呢?
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v a.exe /t reg_sz /d ...
你能不能直接编译成BAT,附件给我,我想看看我到底是那里错了!
谢谢!
回复

使用道具 举报

58#
 楼主| 发表于 2006-12-28 22:01:46 | 只看该作者
原帖由 namejm 于 2006-12-27 09:47 PM 发表
  要把路径中的单斜杠换成双斜杠,可以参考如下演示代码:

@echo off
set "var=%cd%"
set "str=%var:\=\\%"
echo "%str%"
pause

能用了!呵呵,但我不是很理解,等我想想在把代码贴上来,大家给看看啊!!

[ 本帖最后由 鹤冲天 于 2006-12-28 10:19 PM 编辑 ]
回复

使用道具 举报

59#
发表于 2006-12-29 15:21:03 | 只看该作者
已经收下了,谢谢!!!
回复

使用道具 举报

60#
发表于 2006-12-29 16:16:58 | 只看该作者
原帖由 鹤冲天 于 2006-12-28 10:01 PM 发表

能用了!呵呵,但我不是很理解,等我想想在把代码贴上来,大家给看看啊!!

  在 set 命令的帮助中有这么一段话:

  1. 环境变量替换已如下增强:

  2.     %PATH:str1=str2%

  3. 会扩展 PATH 环境变量,用 "str2" 代替扩展结果中的每个 "str1"。
  4. 要有效地从扩展结果中删除所有的 "str1","str2" 可以是空的。
  5. "str1" 可以以星号打头;在这种情况下,"str1" 会从扩展结果的
  6. 开始到 str1 剩余部分第一次出现的地方,都一直保持相配。
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-4-25 17:27

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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