原创 DOS实例练习,解答

2008-1-21 12:08 2873 3 3 分类: 软件与OS

引用地址:http://bbs.povop.com/read.php?tid=98


 


问一:
偶的DOS基础真是有一点点弱!(暴汗!)
看3。BAT晕的有点喘不上气儿了!爬上来透口气儿!
set /a kk+=1  
这句最终自己也不能确定!希望namejm老师能帮忙解释下!
自己是这样理解的,设置KK为环境变量,最终结果是=1,现在是零??晕了!!越看帮助越晕!
ping 1.1.1.1 -n 2 -w 300>nul
ping这个IP,指定2次延时300毫秒无任何输出
换句话说就是延时600毫秒执行下一句
if "%kk%"="1" goto 11
如果变量KK=1那么跳转到11
下同
就这水平了,namejm老师多费心了!我这给您鞠躬了
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
回答:
set /a kk+=1是 set kk=%kk%+1 的缩写形式,也就是累加1的意思。如果最开始没有设置kk的值,用第一次用 set /a 来操作 kk 的时候,默认 kk 的值为0,当执行到 :55 的时候,set kk= 一句会把变量的值清空,第一次碰到 set /a 语句的时候,又会把 kk 的值重新设置为默认的0。

###########################################################
问二:
22.bat
if #%ii%==#10 goto yy
这两个#号是什么意思?
去掉效果是一样的啊!(至少看到的效果是一样的)
在有我现在看到%这个符号都哆嗦!怎么那里都用啊!那个和那个也不一样!!??
88.bat特意强调了不一样?
echo %~f0
echo %%~dp0
:这是显示%~dp0这个字符,看好了%的个数
%
%%
%ii%
该怎么理解它们?

回答:
对一组文件中的每一个文件执行某个特定命令。

FOR %variable IN (set) DO command [command-parameters]

%variable 指定一个单一字母可替换的参数。
(set)     指定一个或一组文件。可以使用通配符。
command   指定对每个文件执行的命令。
command-parameters
        为特定命令指定参数或命令行开关。

在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable
而不要用 %variable。……
百分号对之间夹字符串,表示是对该变量的引用,在变量延迟的时候,百分号对要换成感叹号对。

############################################################
问三:
for的帮助我看了,这还算能理解!
主要是88.bat
@echo off
echo %~f0
echo @echo off
echo %~f0
echo %%~dp0
:这是显示%~dp0这个字符,看好了%的个数
这我就有点晕了,%~dp0 是显示当前批处理所在路径(试验知道的)为啥在+个%就不执行了,而只是个字符了呢??这有帮助吗?我应该怎么得到这些信息??
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
回答:
Re 17#

  %~dp0 还是 for 语句的变量扩展的组合形式,其中,%0 是"形参",表示批处理文件本身,类似的还有%1~%9,一般用在 call 语句中。请看 for 的变量扩展描述:


CODE:[Copy to clipboard]另外,FOR 变量参照的替换已被增强。您现在可以使用下列
选项语法:

  ~I       - 删除任何引号("),扩充 %I
  %~fI     - 将 %I 扩充到一个完全合格的路径名
  %~dI     - 仅将 %I 扩充到一个驱动器号
  %~pI     - 仅将 %I 扩充到一个路径
  %~nI     - 仅将 %I 扩充到一个文件名
  %~xI     - 仅将 %I 扩充到一个文件扩展名
  %~sI     - 扩充的路径只含有短名
  %~aI     - 将 %I 扩充到文件的文件属性
  %~tI     - 将 %I 扩充到文件的日期/时间
  %~zI     - 将 %I 扩充到文件的大小
  %~$PATH:I   - 查找列在路径环境变量的目录,并将 %I 扩充
            到找到的第一个完全合格的名称。如果环境变量名
            未被定义,或者没有找到文件,此组合键会扩充到
            空字符串

可以组合修饰符来得到多重结果:

  %~dpI     - 仅将 %I 扩充到一个驱动器号和路径
  %~nxI     - 仅将 %I 扩充到一个文件名和扩展名
  %~fsI     - 仅将 %I 扩充到一个带有短名的完整路径名
  %~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充
            到找到的第一个驱动器号和路径。
  %~ftzaI   - 将 %I 扩充到类似输出线路的 DIR
Re 19#

  for 语句功能十分强大,若能把它研究透,离高手也就不远了。但是非常不幸,MS自家的帮助信息居然有不少错误的表述,估计是哪位E文没学好的家伙翻译过来的。

  eol=- 实际上是忽略以 - 开头的行;delims= 表示以等号后面的符号为分隔符来提取文本信息,提取的时候,因为这些符号是做了分隔符的,所以提取出来的信息中是不会含有这些符号的,除非使用 tokens="1"* 之类带星号的格式来提取;当 delims= 后只有一个符号的时候,还很容易理解,如果有多个符号的话,情况就变得十分复杂了,由于本人平时只注重使用,而不善于归纳总结,对这种情况也没多少可说的,只能建议你变换条件来反复测试。

##################################################
问:
想问一个namajm老师,批处理有没有办法将自身某一块或N块的内容输出为某一个文件?

例如本身批处理中有一个:start的块,如何将这块的内容用>>1.txt的方式输出成一个文件咧?

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
回答:

在特定条件下,批处理能将自身某一块或某N块的内容输出为某一文件,这些条件有(满足其中一条即可):

  1、信息块本身有CMD能处理的起止标记;
  2、信息块位于文件中某些特定的行;

  以下是一些演示代码:


CODE:[Copy to clipboard]@echo off
:: 把以 :start 开始,goto :eof之前的信息段输出到test.txt
cd.>test.txt
set switch="1"
for /f "delims=" %%i in ('findstr .* "%~0"') do (
  if /i "%%i"==":start" set switch=
  if /i "%%i"=="goto :eof" set switch="1"
  if not defined switch >>test.txt echo.%%i
)
start test.txt
exit

:start
@echo off
echo hello world
pause>nul
goto :eof

:end
exit



CODE:[Copy to clipboard]@echo off
:: 把 :start 标签段的信息段输出到test.txt(忽略空行)
cd.>test.txt
set num="0"
setlocal enabledelayedexpansion
for /f "delims=" %%i in ('findstr .* "%~0"') do (
  set /a num+=1
  if !num! gtr 12 if !num! lss 17 >>test.txt echo.%%i
)
start test.txt
exit

:start
@echo off

echo hello world
pause>nul
goto :eof

:end
exit



CODE:[Copy to clipboard]@echo off
:: 将 :start 之后的所有内容输出到 test.txt
>test.txt more +7 "%~0"
start test.txt
goto :eof

:start
@echo off
echo hello world
pause>nul

:next
@echo off
echo hell bbs.wuyou.com
pause>nul

文章评论0条评论)

登录后参与讨论
我要评论
0
3
关闭 站长推荐上一条 /2 下一条