教程后续不断更新,补充,新手敬请期待
也欢迎你的加入,有新发现plp626愿与你共同探讨,分享.
网志--学习笔记
-------适合于有一定基础者---------
~~~~~~~~~~~~~请大家暂不要发水贴!
可以-----> 提出建议与意见.
可以-----> 批评!
欢迎-----> 指出错误!!!
~~~~~~~~~~~~~谢谢!
声明:我不敢说本帖的代码都是原创但引用时务必注明 from cn-dos.net
windows,xp下的cmd共有71个内置命令,每个命令都自带了帮助信息,现在先把这些帮助全部导出来放到桌面的cmdhelp目录里
这里给个代码:
@echo off&mode con lines=5 cols=50
md cmdhelp ||(pause&exit)
title 正在导出cmd帮助信息到cmdhelp目录内, 稍等...
chcp 437>nul&call :help E
graftabl 936>nul&call :help C
cd cmdhelp
set mark=───────────────────────────────────
for %%i in (*.E) do (
echo.>>%%i &echo %mark%>>%%i
copy %%~ni.E+%%~ni.C EC_%%~ni.txt>nul
echo %mark%>>EC_%%~ni.txt &echo.>>EC_%%~ni.txt
)
del *.c;*.e
find /v "" *.txt>ALL.help
title 已完成 按任意键查看. &pause>nul
start notepad ALL.help
goto :eof
:help
for /f %%i in ('help^|findstr "^"') do help %%i>>cmdhelp\%%i.%1
goto :eof
本人还是推荐看英文原版帮助的,这个把英文的版本与中文版本放在一起了,英语差点可以结合着看,
本想做成htm格式,这个我还没想好,论坛里已经有人写过相关代码,搜下借鉴着改*改,就可以了.
(P.S.:17楼ZJHJ已经给出了相关代码,可以参考参考)
下面的帖子是我边学别写的,有收获就添,所以修改是难免的,里面的用法有些可能帮助里没有解释,那这些大都是我从论坛里前辈那总结的,
掌握变量截取%str:~x,y%即:%str%的偏移量为x处,长度为y的字符
~~~~~~~~~plp626于 2008-1-28 ~~~~~~~~~~
start────────────────────────────────────────────────
经常要用到变量的截取,所以这个命令自然得熟练掌握,这里x,y有正有负,总共也就4种情况,分别都是怎么截取呢?
做个小试验,命令提示符下演示结果:
echo off
set str=%date%
echo %str%
2008-01-28 星期一这个显示结果是说, 变量%str%的值为"2008-01-28 星期一"
set a=%str:~2,4%
echo %a%
08-0这个说明,从%str%第2个字符右侧,往后截取4个字符, 就是变量%a%的值.下同理
set b=%str:~6,-2%
echo %b%
1-28 星从%str%第6个字符右侧,往后截取%str%最后2个字符所剩余的字符, 就是变量%b%的值
set c=%str:~-3,2%
echo %c%
星期从%str%的倒数第3个字符左侧,往后截取2个字符, 就是变量%c%的值
set d=%str:~-6,-2%
echo %d%
28 星从%str%的倒数第6个字符左侧,往后截取%str%最后2个字符所剩余的字符,就是变量%d%的值
-------------------------------------------------------------------------------------------------------------------------------
上面4种情况记忆是不方便的,重要的是抓住共性,下面是我的理解(很不专业!因为偶不是jsj专业的):
观察上面4个赋值语句并归纳得到语句
set s=%str:~x,y%
的作用就是:在字符串%str%的偏移量x处,取"长度"为y的字符,然后赋给变量s.
理解与掌握:
记: 左->右 ---正方向
右->左 ---负方向
x为正或0时,偏移量x处表示沿着正方向第x个字符的右侧处.
x为负时, 偏移量x处表示沿着负方向第x个字符的左侧处.
例如 abcdefg的偏移量为-4处就是字符d的左侧处
y为正或0时,取"长度"为y的字符表示沿正方向获取y个字符.
y为负时, 取"长度"为y的字符表示沿负方向舍弃|y|(y的绝对值)个字符所得的剩余字符.
例如 abcdefg的偏移量为-4处,获取长度为2的字符,就是字符d的左侧处,沿正方向获取2个字符即:"de"
abcdefg的偏移量为2处,获取长度为-4的字符,就是字符b的右侧处,沿负方向舍弃4个字符即得到剩余的字符:"c"
另外:
当y为负时, %str:~y%表示获取%str%的后|y|字符(这个可以看做%str:~-|y|,|y|%的简写)
当y为正时, %str:~y%表示舍弃%str%的前y个字符后剩余的字符(这个很重要,用偏移量+长度的方法不能表示的.)
关于简写:
x或y其中之一为0时,0可省略. 比如: %str:~0,3% 可简写为 %str:~,3%
x为正时 : %str:~-x,x'% 可简写为 %str:~-x% (这里x'是大于x的任意正数)
最后说下,不合理的截取将会得到"空"值.
比如现在执行
set str=abcde
set f=%str:~-2,y%
显然%str%的偏移量-2处为字符"d"的左侧,由于不管y为多少,所获取的字符串都是剩余字符串"de"的子集,所以要想%f%不为空,就要合理截取.
当y取0,±1,2其中之一时%f%不为空;当y小于或等于-2时%f%为空,而当y大于或等于2时%f%恒为"de".
─────────────────────────────────────────────────end
另外:
环境变量替换已有如下增强:
%PATH:str1=str2%
会扩展 PATH 环境变量,用 "str2" 代替扩展结果中的每个 "str1"。
要有效地从扩展结果中删除所有的 "str1","str2" 可以是空的。
"str1" 可以以星号打头;在这种情况下,"str1" 会从扩展结果的
开始到 str1 剩余部分第一次出现的地方,都一直保持相配。
比如执行:
set a=123456123456
set b=123456123456
echo %a:2=+%
echo %b:1=%将显示: 1+34561+3456
2345623456
<1>.很重要的set 命令
set共两个参数/a 与/p
直接键入"set" 会显示系统化境变量及当前环境变量,
而 键入"set p" 会显示所有以字母 P 打头的变量
缺省参数的情况不用多说,注意两点
1.赋空值:
set "a="
2.养成好的习惯,以免多赋值一个空格出错.
比如:
set str=abc
时加上一对双引号
set "str=abc"
对于/a 参数
/A 命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式
评估器很简单并以递减的优先权顺序支持下列操作:
() - 分组
! ~ - - 一元运算符
* / % - 算数运算符
+ - - 算数运算符
<< >> - 逻辑移位
& - 按位“与”
^ - 按位“异”
| - 按位“或”
= *= /= %= += -= - 赋值
&= ^= |= <<= >>=
, - 表达式分隔符
注意前提:
1. 8进制数0?(0<=?<=7)与16进制数0x?(0<=?<=15),首字符不为0者为10进制数.
2. /a参数只对-(2^31-1)至2^31之间整数进行操作(注意是xp版本).
这点可以用代码来测试:
@echo off&setlocal enabledelayedexpansion
:支持最大数为1.9950631168807583848837421626836e+3010
set m=1
for /l %%a in (1 1 10000) do (
for /l %%b in (1 1 %%a) do (
set /a m*=2
set /a n+=1
echo !m!=2^^^^!n!
if "!m:~,1!" == "-" echo !m!&set /a mm=!m!-1&echo !mm!=!m!-1 &pause&exit
) )
一元运算符~ ! -
~取反
将-(2^31-1)至2^31看做一个数轴,"原点O"为0的左侧与-1的右侧
(此数轴可以看做一个首尾封闭的数轴,对2^31-1加1将得到-2^31)
这样可以将计算机里的二进制数(全是整数)的取反看做求"相反数"了:
-2^31 ...︺︺︺︺︺︺︺︺︺︺︺︺︺︺︺O︺︺︺︺︺︺︺︺︺︺︺︺︺︺︺... 2^31-1
... -3 -2 -1 0 1 2 3 ...
~就表示的反数
比如:
set /a a=~-1%a%就等于0
set /a a=~5%a%就等于-6
!取非
!为0
!为1
比如:
set /a a=!2%a%就等于0
set /a a=!0%a%就等于1
"-"取负数
-与数学上的-x是一致的,只是要注意发生溢出时的状况
比如:
set /a a=-(-2147483648)%a%为-2147483648而非2147483648,这是因为2147483648已溢出:
2147483648=(2^31-1)+1
算术运算符 * / % ﹢ -
算术运算符: * / % ﹢ - 分别对应
数学符号: x ÷ mod(取余) + -
需要注意的是"%"是在命令行下,而在bat中则要用%%
逻辑移位: << >>
注意在批处理中或命令行下要加上一对双引号""或用^对<,>进行转义.
set /a "<<"
表示对的二进制数左移位
比如:
set /a a=15"<<"1%a%就等于30
这是因为:15=bin(00 00000 00000 00000 00000 00000 01111)
左移1位就成了bin(0 00000 00000 00000 00000 00000 011110)
而bin(0 00000 00000 00000 00000 00000 011110)=2^4+2^3+2^2+2^1=30
经过简单的数学推导就可以知道:
"<<"==*2^
">>"==/2^(注意溢出)
同理">>"就是右移,原理一样,这里略.
逻辑 "异", "或", "与": "^", "|", "&"
注意在批处理中或命令行下要在运算符前加上^
这里的: ^ | & 对应于
离散数学上的: 异或⊕ 析取∨ 合取∧
规则: 合取∧(有0则0) 析取∨ (有1则1) 异或⊕ (同0反1)
比如:
set /a a=15^^5%a%就等于10
这是因为:
01111
⊕) 00101
─────
=) 01010
而bin(01010)=10
对于"|", "&"原理一样,这里略.
赋值运算符
"=" 这个不用说了
对于 *= /= %= += -= &= ^= |= <<= >>
拿"+="为例,其他同理.
这只是一种简写
比如下面两行代码等效:
set /a a+=2
set /a a=a+2
表达式分隔符","
这个运算符可以用来简化代码:
比如:
set /a a=1
set /a b=2
set /a c+=3
就可以简写为:
set /a a=1,b=2,c+=3
求分数的小数部分
例计算7/5小数点100位:
call:div 7 5 100 ans
@echo off
:div
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Setlocal Enabledelayedexpansion&set/a b=%2,R=%1%%b*10&set "dc="
For /l %%z In (1 1 %3)Do (set/a d=R/b,R=R%%b*10&set dc=!dc!!d!)
endlocal&set "%4=%dc%"
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
exit/b另外:
set /a ... 与 set /p ...
可以省略掉set 与 /之间的空格写成
set/a ... 与 set/p ...
关于这类省略空格的用法,还有不少,后续再补充.
set/a的指针用法(有点像指针姑且这么叫吧):
数值定义:
@echo off
call:arr arr 1 2 3 4 + d d+ 258 68 944 ddd pp dd
set arr
pause
:arr
set/a n+=1
if %2.==. goto:eof
set %1%n%=%2
shift /2
goto:arr统计字符串中各种字符出现次数:
@echo off
set "str=aferefwfwerergrgreaaffwafwa"
set/p= %str% 中有<nul
:loop
set /a %str:~0,1%+=1&set str=%str:~1%&if defined str goto loop
echo a %a% 个
pause关于参数/P
set/p 有两种用法:
1.接收键盘的输入
@echo off
:begin
SET /p a=请输入一个字符串:
echo %a%
goto begin
注意能用来作为变量的字符不能是常量数字,可以是字母,汉字等,及其字符串.
当输入特殊字符^&|<>时,前要加上^,否则出现语法错误.
语句"SET /p a=请输入一个字符串:"
类似c++里的:
cout << "请输入一个字符串:\n";
cin >> a;2.接收文件的首行.
这个用下面两个代码可以理解%0表示批处理本身:
代码一:
:::::::::::::::::::
@echo off
set /p a=<%0
echo %a%&pause>nul
代码二:
::::::&color 02
@echo off
set /p a=<%0
echo %a%&pause>nul
3, set/p 特殊用法 .
左对齐(注意代码中的是制表符):
@echo off&setlocal enabledelayedexpansion
for /l %%i in (1 10 999) do (set/a n+=1&set /p=^%%i <nul
if !n!==5 set n=0&echo.
)
pause删回车符延迟(也可用ping)显示:
@echo off
for /f "tokens=*" %%i in (1.txt) do echo.|set /p=%%i
pause删除1.txt每行的回车符后输出到2.txt里(拼成一行):
@echo off
for /f "tokens=*" %%i in (1.txt) do set /p=%%i<nul >>2.txt
pause一般地set /p 的这种用法都会与|或<nul 联系起来.
<nul使得输出的最后一个字符没有换行符,这点很有用.
[ Last edited by plp626 on 2009-4-24 at 05:00 ]
