1、@
描述:表示不显示@后面的命令,在入侵过程中(例如使用批处理来格式化敌人的硬盘)自然不能让对方看到你使用的命令啦。 例子: @echo off
@echo Now initializing the program, please wait a minite ...
@format X: /q/u/autoset (format 这个命令是不可以使用/y这个参数的,可喜的是微软留了个autoset这个参数给我们,效果和/y是一样的。) 2、call
描述:从一个批处理调用另一个批处理而不终止父批处理,并且允许参数传递 语法:call filename lable 实例1: pause set aa=2 set bb=110.txt
call 123.bat %aa% %bb% pause 实例2:
findstr %aa% %bb% 实例3: asdf 123 234 3、pause 描述:暂停命令 4、rem
描述:注释命令 5、:和goto
描述:标签,跳转到指定标签 语法:goto :lable 说明:
为什么要把这两个命令联合起来介绍,因为它们是分不开的,无论少了哪个或多了哪个都会出错。goto是个跳转命令,:是一个标签。当程序运行到goto时,将自动跳转到:定义的部分去执行了。 goto命令的另一种用法一:提前结束程序。在程序中间使用goto命令跳转到某一标签,而这一标签的内容却定义为退出。 6、Setlocal
描述:开始批处理文件中环境改动的本地化操作。在执行 SETLOCAL 之后所做的环境改动只限于批处理文件。要还原原先的设置,必须执行 ENDLOCAL。达到批处理文件结尾时,对于该批处理文件的每个尚未执行的 SETLOCAL 命令,都会有一个隐含的 ENDLOCAL 被执行。 语法:
ENABLEEXTENSIONS / DISABLEEXTENSIONS
ENABLEDELAYEDEXPANSION / DISABLEDELAYEDEXPANSION
说明:
如果有一个参数,SETLOCAL 命令将设置 ERRORLEVEL 的值。如果有两个有效参数中的一个,该值则为零。用下列技巧,您可以在批脚本中使用这个来决定扩展名是否可用: 例子1: @echo off
for /l %%i in (1,1,10) do ( set \"str=%%i\" echo %str% )
pause>nul 例子2:
@echo off&setlocal enabledelayedexpansion for /l %%i in (1,1,10) do ( set \"str=%%i\" echo !str! )
pause>nul
第一段代码只会显示10行“ECHO 处于关闭状态。”,而第二段代码则会正确显示1-10的10行数字。这是为什么呢?因为在两段代码的for循环前str都是没有被定义的,而由于第一段代码没有开启变量延迟,所以str值一直是没有定义,因而显示出了10行报错信息;而第二段代码开启了变量延迟,在for循环中每次赋予str的值被传递下去,因而会正确显示10行数字,但这里的str变量符必须要写成!str!,这是没有道理可讲的,只要记住就好了。 例子3: @echo off set /a m=0
for /l %%i in (1,1,5) do ( set /a m=m+1 & echo %m%) pause 会显示 0 0 0 0 0 例子4:
@echo off & setlocal enabledelayedexpansion
for /l %%i in (1,1,5) do ( set /a m=m+1 & echo !m!) pause 会显示 1 2 3 4 5 7、more
描述:逐屏显示输出。 语法:
MORE [/E [/C] [/S] [/Tn] [+n]] < [drive:][path]filenamecommand-name | MORE [/E [/C] [/P] [/S] [/Tn] [+n]]
MORE /E [/C] [/P] [/S] [/Tn] [+n] [files] 参数:
[drive:][path]filename 指定要逐屏显示的文件。
command-name 指定要显示其输出的命令。 /E 启用扩展功能
/C 显示页面前先清除屏幕 /S 将多个空白行缩成一行
/Tn 将跳格键扩展成 n 个空格(默认值为 8) +n 从第 n 行开始显示第一个文件
files 要显示的文件列表。用空格分开列表中的文件。 如果扩展的功能已经启用,在 -- More -- 提示处会接受下列 命令:
P n 显示下 n 行 S n 略过下 n 行 F 显示下个文件 Q 退出 = 显示行号 描述:注释命令 说明:在批处理脚本中和rem命令等效。它后面的内容在执行时不显示,也不起任何作用,因为它只是注释,只是增加了脚本的可读性,和C语言中的/*„„„„*/类似。地球人都能看懂,就不多说了。 9、echo 描述:中文为“反馈”、“回显”的意思。 语法:echo on echo off Echo [表达式] 说明: 它其实是一个开关命令,就是说它只有两种状态:打开和关闭。于是就有了echo on和echo off两个命令了。直接执行echo命令将显示当前echo命令状态(off或on)执行echo off将关闭回显,它后面的所有命令都不显示命令本身,只显示执行后的结果,除非执行echo on命令。 echo命令的另一种用法一:可以用它来显示信息! echo命令的另一种用法二:可以直接编辑文本文件。 echo nbtstat -A 192.168.0.1 > a.bat echo nbtstat -A 192.168.0.2 >> a.bat echo nbtstat -A 192.168.0.3 >> a.bat 以上脚本内容的编辑方法是,直接是命令行输入,每行一回车。最后就会在当前目录下生成一个a.bat的文件,直接执行就会得到结果。 10、| 描述:管道命令 说明:这个命令恐怕大家不是很陌生,经常操作DOS的朋友都应该知道,当我们查看一个命令的帮助时,如果帮助信息比较长,一屏幕显示不完时DOS并不给我们时间让我们看完一屏幕再翻到另一屏幕,而是直接显示到帮助信息的最后。如在提示符下输入help回车时,就会看到当前DOS版本所支持的所有非隐含命令,但你只能看到最后的那些命令,前面的早就一闪而过了,如何解决这个问题? 例子1: help | more 回车后会发现显示满一屏幕后就自动暂停,等候继续显示其他信息。当按写回车时,变成一个一个的出现;按下空格键时一屏幕一屏幕显示,直到全部显示完为止;按其他键自动停止返回DOS。 为什么会出现上述现象?答案很简单,这里结合了管道命令|和DOS命令more来共同达到目的的。这里先简单介绍一下help命令和more命令,对理解|命令的用法有很大帮助。 help命令。其实这个命令是不需要多说的,但在上述例子中help命令的用法比较特殊,直接在DOS提示符下输入help命令,结果是让DOS显示其所支持的所有非隐含命令,而在其他地方用help命令,如输入net help回车,则是显示net命令的帮助信息。 more命令。可能很多朋友以前就没有接触过这个命令,这个命令在Linux下的用处非常广泛,也是管道命令之一。大家可以找一篇比较长的文章(a.txt)在DOS提示符下输入如下两个命令去比较一下差别:more a.txt和type a.txt。利用more命令,可以达到逐屏或逐行显示输出的效果,而type命令只能一次把输出显示完,最后的结果就是只能看到末尾的部分。 11、>、>> 描述:这两个命令的效果从本质上来说都是一样的,他们都是输出重定向命令,说的通俗一点,就是把前面命令的输出写入到一个文件中。这两个命令的唯一区别是,>会清除掉原有文件中的内容后把新的内容写入原文件,而>>只会另起一行追加新的内容到原文件中,而不会改动其中的原有内容 例子1: echo @echo off > a.bat echo echo This is a pipeline command example. >> a.bat echo echo It is very easy? >> a.bat echo echo Believe your self! >> a.bat echo pause >> a.bat echo exit >> a.bat 依次在DOS提示符下输入以上各行命令,一行一个回车,将在当前目录下生成一个a.bat文件,里面的内容如下: @echo off echo This is a pipeline command example. echo It is very easy? echo Believe your self! pause exit 如果这里只用>命令来完成上面操作,最后也会生成一个a.bat,但里面的内容就只剩下最后一行exit了。所以>和>>一般都联合起来用,除非你重定向的输出只有一行,那么就可以只用>了。 12、<、>&、<& 描述:这三个命令也是管道命令 <,输入重定向命令,从文件中读入命令输入,而不是从键盘中读入。 >&,将一个句柄的输出写入到另一个句柄的输入中。 <&,刚好和>&相反,从一个句柄读取输入并将其写入到另一个句柄输出中。 13、& 描述:用来连接n个DOS命令,并把这些命令按顺序执行不管是否有命令执行失败 例子: copy a.txt b.txt /y & del a.txt 说明:其实这句和move a.txt b.txt的效果是一样的,只不过前者是分了两步来进行的(在后面还将涉及到具体使用哪种方法的问题)。这个命令很简单,就不多费口舌了,唯一需要注意的一点是,这里&两边的命令是有执行顺序的,从前往后执行。 14、&& 描述:它可以把它前后两个命令组合起来当一个命令来用,它在从前往后依次执行被它连接的几个命令时会自动判断是否有某个命令执行出错,一旦发现出错后将不继续执行后面剩下的命令 例子1: copy c:\\123.txt e:\\&&dir c:\\ 你是否还记得“有些命令是不能同时执行的”?你是否相信这句话?当然得相信,不信就给你出道题:把C盘和D盘的文件和文件夹列出到a.txt文件中。你将如何来搞定这道题?有朋友说,这还不是很easy的问题吗?同时执行两个dir,然后把得到的结果>到a.txt里就ok了嘛 例子2: dir c:\\ && dir d:\\ > a.txt 仔细研究一下这句执行后的结果,看看是否能达到题目的要求。错了,这样执行后a.txt里只有D盘的信息!为什么?就因为这里&&命令和>命令不能同时出现一个句子里(批处理把一行看成一个句子)组合命令&&的优先级没有管道命令>的优先级高!所以这句在执行时将本分成这两部分:dir c:\\和dir d:\\ > a.txt,而并不是如你想的这两部分:dir c:\\ && dir d:\\和> a.txt。要使用组合命令&&达到题目的要求,必须得这么写: dir c:\\ > a.txt && dir d:\\ >> a.txt 这样,依据优先级高低,DOS将把这句话分成以下两部分:dir c:\\ > a.txt和dir d:\\ >> a.txt。 15、|| 描述:当遇到一个执行正确的命令就退出此命令组合,不再继续执行下面的命令 说明:这个命令的用法和&&几乎一样,但作用刚好和它相反 例子1: @echo off dir *.exe||exit 其实这个例子是有破绽的,你看出来了吗?其实很简单,自己试试就知道了嘛:如果存在那个exe文件,就退出;如果不存在那个exe文件,也退出!为什么?因为如果不存在那个.exe文件,则前一条命令dir s*.exe执行肯定是不成功的,所以就继续执行exit,自然就退出了,呵呵。那么如何解决题目给出的问题呢? 例子2: @echo off dir *.exe || echo Didn't exist file s*.exe & pause & exit 这样执行的结果,就能达到题目的要求,是否存在*.exe将出现两种结果。这里加暂停的意思,当然是让你能看到echo输出的内容,否则一闪而过的窗口,echo就白写了。 例子3: @echo off dir a.ttt /a & dir a.txt || exit 例子4: @echo off dir a.ttt /a && dir a.txt || exit 基本格式: FOR 参数 %%变量名 IN (相关文件或命令) DO 执行的命令 参数: 4个参数 /d /l /r /f 他们的作用我在下面用例子解释 %%变量名 : 这个变量名可以是小写a-z或者大写A-Z,他们区分大小写哦,FOR会把每个读取到的值给他! 执行的命令: 对每个变量的值要执行什么操作就写在这. 1、/d 目录 描述:仅为目录 执行制定操作,而忽略文件 说明:如果 Set 包含通配符(* 和 ?),将对与 Set 相匹配的每个目录(而不是指定目录中的文件组)执行指定的 Command。他主要用于目录搜索,不会搜索文件。 例子1: @echo off for /d %%i in (*) do @echo %%i pause 把他保存放在C盘根目录执行,就会把C盘目录下的全部目录名字打印出来,而文件名字一个也不显示! 例子2: 比如我们要把当前路径下文件夹的名字只有1-3个字母的显示出来。 @echo off for /d %%i in (???) do @echo %%i pause 这样的话如果你当前目录下有目录名字只有1-3个字母的,就会显示出来,没有就不显示了 例子3: @echo off for /d %%i in (window?) do @echo %%i pause 保存到C盘下执行,会显示什么呢?自己看吧! 2、/R递归 描述:进入根目录树 [Drive:]Path,在树的每个目录中执行 for 语句。如果在 /R 后没有指定目录,则认为是当前目录。如果 Set 只是一个句点 (.),则只枚举目录树。 例子1: 把当前或者你指定路径下的文件名字全部读取,注意是文件名字 @echo off for /r c:\\ %%i in (*.exe) do @echo %%i pause 把这个BAT保存到D盘随便哪里然后执行,我会就会看到,他把C盘根目录,和每个目录的子目录下面全部的EXE文件都列出来了!!!! 例子2: @echo off for /r %%i in (*.exe) do @echo %%i pause 参数不一样了吧!这个命令前面没加那个C:\\也就是搜索路径,这样他就会以当前目录为搜索路径,比如你这个BAT你把他防灾d:\est目录下执行,那么他就会把D:\est目录和他下面的子目录的全部EXE文件列出来!!! 3、/L迭代数值范围 描述:使用迭代变量设置起始值 (Start#),然后逐步执行一组范围的值,直到该值超过所设置的终止值 (End#)。/L 将通过对 Start# 与 End# 进行比较来执行迭代变量。如果 Start# 小于 End#,就会执行该命令。如果迭代变量超过 End#,则命令解释程序退出此循环。还可以使用负的 Step# 以递减数值的方式逐步执行此范围内的值。例如,(1,1,5) 生成序列 1 2 3 4 5,而 (5,-1,1) 则生成序列 (5 4 3 2 1)。 语法: for /L %% Variable in (Start#,Step#,End#) do Command 例子1: @echo off for /l %%i in (1,1,5) do @echo %%i pause 保存执行看效果,他会打印从1 2 3 4 5 这样5个数字。(1,1,5)这个参数也就是表示从1开始每次加1直到5终止! 例子2:: @echo off for /l %%i in (1,1,5) do start cmd pause 执行后是不是吓了一跳,怎么多了5个CMD窗口,呵呵!如果把那个 (1,1,5)改成 (1,1,65535)会有什么结果,我先告诉大家,会打开65535个CMD窗口....这么多你不死机算你强! 当然我们也可以把那个start cmd改成md %%i 这样就会建立指定个目录了,名字为1-65535 4、/f迭代及文件解析 描述: 使用文件解析来处理命令输出、字符串及文件内容。使用迭代变量定义要检查的内容或字符串,并使用各种 ParsingKeywords 选项进一步修改解析方式。使用 ParsingKeywords 令牌选项指定哪些令牌应该作为迭代变量传递。 语法: for /F \"ParsingKeywords\" %% Variable in (FileNameSet) do Command for /F \"ParsingKeywords\" %% Variable in (FileNameSet) do Command 注意:在没有使用令牌选项时,/F 将只检查第一个令牌。 说明: 文件解析过程包括读取输出、字符串或文件内容,将其分成的文本行以及再将每行解析成零个或更多个令牌。然后通过设置为令牌的迭代变量值,调用 for 循环。默认情况下,/F 传递每个文件每一行的第一个空白分隔符号。跳过空行。 参数: ParsingKeywords 他表示4个参数 eol=c 指一个行注释字符的结尾(就一个) skip=n 指在文件开始时忽略的行数。 delims=xxx 指分隔符集。这个替换了空格和跳格键的默认分隔符集。 tokens=x,y,m-n指每行的哪一个符号被传递到每个迭代 的 for 本身。这会导致额外变量名称的分配。m-n格式为一个范围。通过 nth 符号指定 mth。如果符号字符串中的最后一个字符星号,那么额外的变量将在最后一个符号解析之后分配并接受行的保留文本。 usebackq 指定新语法已在下类情况中使用: 在作为命令执行一个后引号的字符串并且一个单引号字符为文字字符串命令并允许在 filenameset中使用双引号扩起文件名称。 usebackq这个参数不用理解了,系统默认会给我们加上! 例子1: 为了能使用这个例子,我们先新建一个文本文件,在里面打上这些内容保存为test.txt: ;郁闷啊! 您好! 欢迎来到, 非常批处理 我们的网站 bbs.verybat.org 完毕! @echo off FOR /F \"eol=; tokens=1 delims= \" %%i in (test.txt) do @echo %%i pause 我们把这个BAT保存到和你的test.txt相同的目录下面然后执行 我们会看到屏幕上会显示: 您好! 我们的网站 完毕! 为什么会这样?我来解释 这个命令会读取在当前目录下名为test.txt文件中的内容,将每一行的内容赋值给变量%%i,忽略掉以;号开头的行,并且以空格做为分隔符号,打印每行以空格做分隔符号的第一列 结果就是这样了!! 例子2: @echo off FOR /F \"delims=\" %%i in ('net user') do @echo %%i pause 这样你本机全部帐号名字就出来了把扩号内的内容用两个单引号引起来就表示那个当命令执行,FOR会返回命令的每行结果,加那个\"delims=\" 是为了让我空格的行能整行显示出来,不加就只显示空格左边一列! IF有3种基本的用法: IF [NOT] ERRORLEVEL number command IF [NOT] string1==string2 command IF [NOT] EXIST filename command 用法详解 1、IF [NOT] ERRORLEVEL number command 这个用法的基本做用是判断上一条命令执行结果的代码,以决定下一个步骤.一般上一条命令的执行结果代码只有两结果,\"成功\"用0表示 \"失败\"用1表示. 例子: @echo off net user IF %ERRORLEVEL% == 0 echo net user 执行成功了! pause 这是个简单判断上条命令是否执行成功. 细心的朋友可能会发现,这个用法和帮助里的用法不太一样,按照帮助里的写法 \"IF %ERRORLEVEL% == 0 echo net user 执行成功了! \"这一句代码因该写成:IF ERRORLEVEL 0 echo net user 执行成功了! 那为什么我要写成这样呢?各位自己把代码改掉执行后,就会发现错误了!用这种语法,不管你的上面的命令是否执行成功,他都会认为命令成功了,不知道是BUG还是本人理解错误... %ERRORLEVEL% 这是个系统变量,返回上条命令的执行结果代码! \"成功\"用0表示 \"失败\"用1表示. 当然还有其他参数,用的时候基本就这两数字. 例子2: @echo off net usertest IF %ERRORLEVEL% == 1 echo net user 执行失败了! pause 这个是判断上一条命令是否执行失败的 @echo off set /p var=随便输入个命令: %var% if %ERRORLEVEL% == 0 goto yes goto no :yes echo !var! 执行成功了 pause exit :no echo 基本上执行失败了.. pause 这个是根据你输入的命令,自动判断是成功还是失败了! 例子3: 在来一个简化版的 @echo off set /p var=随便输入个命令: %var% if %ERRORLEVEL% == 0 (echo %var%执行成功了) ELSE echo %var%执行失败了! Pause else后面写上执行失败后的操作! 当然我门还可以把if else这样的语句分成几行写出来,使他看上去好看点... @echo off set /p var=随便输入个命令: %var% if %ERRORLEVEL% == 0 ( echo !var! 执行成功了 ) ELSE ( echo 基本上执行失败了.. ) pause 这里介绍的两种简写对IF的三种语法都可以套用,不单单是在IF [NOT] ERRORLEVEL number command 这种法上才能用 2、第二种用法IF [NOT] string1==string2 command 这个呢就是用来比较变量或者字符的值是不是相等的. 例子1: @echo off set /p var=请输入第一个比较字符: set /p var2=请输入第二个比较字符: if %var% == %var2% (echo 我们相等) ELSE echo 我们不相等 pause 上面这个例子可以判断你输入的值是不是相等,但是你如果输入相同的字符,但是如果其中一个后面打了一个空格,这个例子还是会认为相等,如何让有空格的输入不相等呢?我们在比较字符上加个双引号就可以了. @echo off set /p var=请输入第一个比较字符: set /p var2=请输入第二个比较字符(多输入个空格试试): if \"%var%\" == \"%var2%\" (echo 我们相等) ELSE echo 我们不相等 pause 3、第三种用法IF [NOT] EXIST filename command 这个就是判断某个文件或者文件夹是否存在的语法 例子1: @echo off if exist \"c:\est\" (echo 存在文件) ELSE echo 不存在文件 pause 判断的文件路径加引号是为了防止路径有空格,如果路径有空格加个双引号就不会出现判断出错了! 这个语法没什么太多的用法,基本就这样了,就不多介绍了. 另外我们看到每条IF用法后都有个[NOT]语句,这啥意思?其他加上他的话,就表示先判断我们的条件不成立时, 例子2: @echo off if not exist \"c:\est\" (echo 存在文件) ELSE echo 不存在文件 pause 加个NOT,执行后有什么结果,如果你的C盘下更本就没c:\est,他还是会显示\"存在文件\这就表示了加了NOT就会先判断条件失败!懂了吧,上面例子改成这样就正确了! @echo off if not exist \"c:\est\" (echo 不存在文件) ELSE echo 存在文件 pause 4、另外IF还有一些增强的用法,如下 IF [/I] string1 compare-op string2 command IF CMDEXTVERSION number command IF DEFINED variable command 后面两个用法,我不做介绍,因为他们和上面的用法表示的意义基本一样,只简单说说 IF [/I] string1 compare-op string2 command这个语句在判断字符时不区分字符的大小写 例子1: @echo off if a == A (echo 我们相等) ELSE echo 我们不相等 pause 执行后会显示我们不相等 @echo off if /i a == A (echo 我们相等) ELSE echo 我们不相等 pause 加上/I不区分大小写就相等了! 4、最后面还有一些用来判断数字的符号 EQU - 等于 NEQ - 不等于 LSS - 小于 LEQ - 小于或等于 GTR - 大于 GEQ - 大于或等于 例子: @echo off set /p var=请输入一个数字: if %var% LEQ 4 (echo 我小于等于4) ELSE echo 我不小于等于4 pause 先回顾一下他设置自定义变量的用法 例子: @echo off set var=我是值 echo %var% pause 请看 set var=我是值 ,这就是BAT直接在批处理中设置变量的方法! set 是命令 var是变量名 =号右边的\"我是值\"是变量的值 在批处理中我们要引用这个变就把var变量名用两个%(百分号)扩起来,如%var%这种SET语法只能直接在BAT代码的提前赋予变量的值,有时候我们需要提供一个交互界面,让用户自己输入变 量的值,然后我们在来根据这个值来做相应操作,现在我就来说说这SET的这种语法,只需要加一个\"/P\"参数就可以了! 例子: @echo off set /p var=请输入变量的值: if %var% == 1 echo 您输入了 1 ~_~ pause set /p 是命令语法 var是变量名 =号右边的\"请输入变量的值: \这个是提示语,不是变量的值了! 运行后,我们在提示语后面直接输入1,就会显示一行您输入了 1 ~_~ ,输入别的就没有任何反映! 好了,先回顾到这,现在讲SET其他功能 使用set /?查看SET的帮助我们发现SET除了我上面讲的 SET [variable=[string]] SET /P variable=[promptString] 这两种语法外,还有如下几种语法: SET /A expression 环境变量替换已如下增强: %PATH:str1=str2% %PATH:~10,5% %PATH:~-10% %PATH:~0,-2% 这机种语法有什么用处呢?现在我们来一个个讲解他们! SET /A expression /A 命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式 评估器很简单并以递减的优先权顺序支持下列操作: () - 分组 ! ~ - - 一元运算符 * / % - 算数运算符 + - - 算数运算符 << >> - 逻辑移位 & - 按位“与” ^ - 按位“异” | - 按位“或” = *= /= %= += -= - 赋值 &= ^= |= <<= >>= , - 表达式分隔符 上面这些是系统帮助里的内容,看着是不是有点晕,没关系我来简单解释一下: set的/A参数就是让SET可以支持数学符号进行加减等一些数算! 现在开始举例子介绍这些数学符号的用法: 看例子这里的例子请直接在CMD下拷贝命令运行,不需要保存为BAT! set /a var=1 + 1 set /a 语法, var变量名 1 + 1 数学式子 拷贝运行后会直接显示一个2,或者运行完后我们输入echo %var%,也是二,这就是 一个简单的加法运算! set /a var=2 - 1 结果是多少呢?如果你看不到结果就echo %var%..... set /a var=2 * 2 乘法运算 set /a var=2 / 2 除法运算 set /a var=(1+1) + (1+1) 结果等于4 看得懂吧! set /a a=1+1,b=2+1,c=3+1 运行后会显示一个4,但我们用 echo %a% %b% %c%后看结果,会发现其他数算也有效果!,这就是\"斗\"号的 作用! 有时候我们需要直接在原变量进行加减操作就可以用这种语法 set /a var+=1 这样的语法对应原始语法就是set /a var = %var% + 1 都是一样的结果,在原变量的值上在进行数算,不过这样写简单一点 在来一个: set /a var*=2 其他都这么用,只要帮助里有这个语法! 另外还有一些用逻辑或取余操作符,这些符号,按照上面的使用方法会报错的 比如我们在CMD里输入set /a var=1 & 1 \"与运算\他并不会显示为1,而是报错, 为什么?对于这样的\"逻辑或取余操作符\我们需要把他们用双引号引起来,看例子 set /a var= 1 \"&\" 1 这样结果就显示出来了,其他逻辑或取余操作符用法 set /a var= 1 \"+\" 1 异运算 set /a var= 1 \"%\" 1 取模运算 set /a var= 2 \"<<\" 2 次方运算 set /a var= 4 \">>\" 2 这个不太记得数学里的叫法.... 还有几个数学不太行,搞不清楚了....不列出来了, 这些符号也可以用&= ^= |= <<= >>= 这样的简单用法如 set /a var\"&=\" 1 等于set /a var = %var% \"&\" 1 注意引号 好符号说到这,现在说%PATH:str1=str2% 这个是替换变量值的内容,看例子 @echo off set a= bbs.verybat.org echo 替换前的值: \"%a%\" set var=%a: =% echo 替换后的值: \"%var%\" pause 对比一下,我们发现他把变量%a%的空格给替换掉了,从这个例子,我们就可以发现 %PATH:str1=str2%这个操作就是把变量%PATH%的里的str1全部用str2替换 比如我们把上面的例子改成这样 @echo off set a=bbs.verybat.org echo 替换前的值: \"%a%\" set var=%a:.=伤脑筋% echo 替换后的值: \"%var%\" pause 解释set var=%a:.=伤脑筋% set命令 var变量名字a是要进行字符替换的变量的值,\".\"为要替换的值, \"伤脑筋\"为替换后的值! 执行后就会把变量%a%里面的\".\"全部替换为\"伤脑筋\" 这就是set的替换字符的很好的功能!先讲到这 %PATH:~10,5% 这个什么意思,看例子: @echo off set a=bbs.verybat.org set var=%a:~1,2% echo %var% pause 执行后,我们会发现只显示了\"bs\"两个字母,我们的变量%a%的值不是为bbs.verybat.org吗 怎么只显示了第2个字母和第3个字母\"bs\分析一结果我们就可以很容易看出 %PATH:~10,5%就是显示变量PATH里指定几位的值! 分析set var=%a:~1,2% set命令 var变量值 a要进行字符操作的变量 \"1\"从变量\"a\"第几位开始显示 \"2\"显示几位 和起来就是把变量a的值从第一位开始,把后两位赋予给变量var 就样因该明白了吧~ 其他两种语法 %PATH:~-10% %PATH:~0,-2% 他们也是显示指定变量指定几位的值得的意思 %PATH:~-10% 例子 @echo off set a=bbs.verybat.org set var=%a:~-3% echo %var% pause 这个就是把变量a倒数3位的值给变量VAR 当然我们也可以改成这样 @echo off set a=bbs.verybat.org set var=%a:~3% echo %var% pause 这个就是把变量a的从第3位开始后面全部的值给变量VAR %PATH:~0,-2% 例子 @echo off set a=bbs.verybat.org set var=%a:~0,-3% echo %var% pause 执行后,我们发现显示的是\"bbs.verybat\少了\".cn\" 从结果分析,很容易分析出,这是把变量a的值从0位开始, 到倒数第三位之间的值全部赋予给var 如果改成这样 @echo off set a=bbs.verybat.org set var=%a:~2,-3% echo %var% pause 那么他就是显示从第2位开始减去倒数三位字符的值,并赋予给变量var,也就是s.verybat. 批处理教程(系统函数部分) 2010年05月30日 星期日 20:09 1、random 描述:随机数函数 例子: echo %random% pause 将会在屏幕显示一个随机的5位的数字。 2、待完善! 批处理中的变量分为两类,分别为\"系统变量\"和\"自定义变量\" 1、系统变量: 他们的值由系统将其根据事先定义的条件自动赋值,也就是这些变量系统已经给他们定义了值, 不需要我们来给他赋值,我们只需要调用而以! 我把他们全部列出来! %ALLUSERSPROFILE% 本地 返回“所有用户”配置文件的位置。 %APPDATA% 本地 返回默认情况下应用程序存储数据的位置。 %CD% 本地 返回当前目录字符串。 %CMDCMDLINE% 本地 返回用来启动当前的 Cmd.exe 的准确命令行。 %CMDEXTVERSION% 系统 返回当前的“命令处理程序扩展”的版本号。 %COMPUTERNAME% 系统 返回计算机的名称。 %COMSPEC% 系统 返回命令行解释器可执行程序的准确路径。 %DATE% 系统 返回当前日期。使用与 date /t 命令相同的格式。由 Cmd.exe 生成。有关 date 命令的详细信息,请参阅 Date。 %ERRORLEVEL% 系统返回上一条命令的错误代码。通常用非零值表示错误。 %HOMEDRIVE% 系统返回连接到用户主目录的本地工作站驱动器号。基于主目录值而设置。用 户主目录是在“本地用户和组”中指定的。 %HOMEPATH% 系统返回用户主目录的完整路径。基于主目录值而设置。用户主目录是在“本 地用户和组”中指定的。 %HOMESHARE% 系统返回用户的共享主目录的网络路径。基于主目录值而设置。用户主目录是 在“本地用户和组”中指定的。 %LOGONSERVER% 本地返回验证当前登录会话的域控制器的名称。 %NUMBER_OF_PROCESSORS% 系统指定安装在计算机上的处理器的数目。 %OS% 系统 返回操作系统名称。Windows 2000 显示其操作系统为 Windows_NT。 %PATH% 系统 指定可执行文件的搜索路径。 %PATHEXT% 系统 返回操作系统认为可执行的文件扩展名的列表。 %PROCESSOR_ARCHITECTURE% 系统返回处理器的芯片体系结构。值:x86 或 IA 基于 Itanium %PROCESSOR_IDENTFIER% 系统 返回处理器说明。 %PROCESSOR_LEVEL% 系统返回计算机上安装的处理器的型号。 %PROCESSOR_REVISION% 系统 返回处理器的版本号。 %PROMPT% 本地 返回当前解释程序的命令提示符设置。由 Cmd.exe 生成。 %RANDOM% 系统 返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。 %SYSTEMDRIVE% 系统 返回包含 Windows server operating system 根目录(即系统根目录) 的驱动器。 %SYSTEMROOT% 系统 返回 Windows server operating system 根目录的位置。 %TEMP% 和 %TMP% 系统和用户 返回对当前登录用户可用的应用程序所使用的默认临时目录。 有些应用程序需要 TEMP,而其他应用程序则需要 TMP。 %TIME% 系统 返回当前时间。使用与 time /t 命令相同的格式。由 Cmd.exe 生成。有关 time 命令的详细信息,请参阅 Time。 %USERDOMAIN% 本地 返回包含用户帐户的域的名称。 %USERNAME% 本地 返回当前登录的用户的名称。 %USERPROFILE% 本地 返回当前用户的配置文件的位置。 %WINDIR% 系统 返回操作系统目录的位置。 例子: 比如我们要复制文件到当前帐号的启动目录里就可以这样 copy d:\\1.bat \"%USERPROFILE%\\「开始」菜单\\程序\\启动\\\" %USERNAME% 本地 返回当前登录的用户的名称。 注意有空格的目录要用引号引起来 2、系统变量,他们分别是%0 %1 %2 %3 %4 %5 ......一直到%9 还有一个%* %0 这个有点特殊,有几层意思,先讲%1-%9的意思. %1 返回批处理的第一个参数 %2 返回批处理的第二个参数 %3-%9依此推类 反回批处理参数?到底怎么个返回法? 我们看这个例子,把下面的代码保存为test.BAT然后放到C盘下 @echo off echo %1 %2 %3 %4 echo %1 echo %2 echo %3 echo %4 进入CMD,输入cd c:\\ 然后输入 test.bat 我是第一个参数我是第二个参数 我是第三个参数 我是第四个参数 注意中间的空额,我们会看到这样的结果: 我是第一个参数我是第二个参数 我是第三个参数 我是第四个参数 我是第一个参数 我是第二个参数 我是第三个参数 我是第四个参数 对比下代码,%1就是我是第一个参数 %2就是我是第二个参数 怎么样理解了吧! 这些%1和%9可以让批处理也能带参数运行,大大提高批处理功能! 还有一个%* 他是什么呢?他的作用不是很大,只是返回参数而已,不过他是一次返回全部参数 的值,不用在输入%1 %2来确定一个个的 例子: @echo off echo %* 同样保存为test.bat 放到C盘 进入CMD,输入cd c:\\ 然后输入 test.bat 我是第一个参数我是第二个参数 我是第三个参数 我是第四个参数 可以看到他一次把全部参数都显示出来了 好现在开始讲那个比较特殊的%0 %0 这个不是返回参数的值了,他有两层意思! 第一层意思:返回批处理所在绝对路径 例子: @echo off echo %0 pause 保存为test.BAT放在桌面运行,会显示如下结果 \"C:\\Documents and Settings\\Administrator\\桌面\est.bat\" 他把当前批处理执行的所在路经打印出来了,这就是返回批处理所在绝对路径的意思 第二层意思:无限循环执行BAT 例子: @echo off net user %0 保存为BAT执行,他就会无限循环执行net user这条命令,直到你手动停止. 以上就是批处理中的一些系统变量,另外还有一些变量,他们也表示一些功能, FOR命令中的那些就是,FOR变量已经说过,就不讲了. 3、现在说自定义变量 故名思意,自定义变量就是由我们来给他赋予值的变量 要使用自定义变量就得使用set命令了,看例子. @echo off set var=我是值 echo %var% pause 保存为BAT执行,我们会看到CMD里返回一个 \"我是值\" var为变量名,=号右变的是要给变量的值 这就是最简单的一种设置变量的方法了 如果我们想让用户手工输入变量的值,而不是在代码里指定,可以用用set命令的/p参数 例子: @echo off set /p var=请输入变量的值 echo %var% pause var变量名 =号右边的是提示语,不是变量的值 变量的值由我们运行后自己用键盘输入! 批处理教程(命令扩展符1/2) 2010年05月30日 星期日 20:11 一、导航 名字 %~1 描述 删除引号 call 2.bat \"test.txt\" echo %~1会显示[test.txt] 而echo%1会显示[\"test.txt\"] %~f1 %~d1 %~p1 %~n1 %~x1 %~s1 %~a1 显示完整路径 文件所在驱动器 去首末路径 文件名 扩展名 短文件名路径 文件属性 拖到含有echo %~f1的文件会显示文件路径 拖到含有echo %~d1的文件会显文件所在驱动器 拖到含有echo %~p1的文件会显文件无首末级路径 拖到含有echo %~n1的文件会显文件名(不含扩展) 拖到含有echo %~x1的文件会显文件扩展名,含点号 拖到含有echo %~s1的文件会显文件短格式路径 拖到含有echo %~a1的文件会显文件属性,格式是-rahs----共九位字符,不存在就用-补齐 %~t1 %~z1 %~dp1 %~nx1 %~fs1 文件修改时间 文件大小 文件路径 拖到含有echo %~t1的文件会显文件最后一次修改时间 拖到含有echo %~z1的文件会显文件大小,单位是字节 拖到含有echo %~dp1的文件会显文件大小路径,不含文件本身 例子 文件名加上扩展名 拖到含有echo %~dp1的文件会显文件全名 8.3格式路径加名称 拖到含有echo %~fs1的文件会显文件8.3格式全称 二、详解 ~I - 删除任何引号(\"),扩展 %I 这个变量的作用就如他的说明,删除引号! 例子: 首先我们在桌面建立一个名字为temp.txt文本文件,在里面输入这些内容 \"1111 2222\" \"3333\" 44\"44 然后在建立个BAT文件代码如下: FOR /F \"delims=\" %%i IN (temp.txt) DO @echo %%~i pause 执行后,我们看CMD的回显如下: 1111 2222\" 3333 44\"44 和之前temp.txt中的内容对比一下,我们会发现第一行和第三行的引号都消失了,这就是删除引号~i的作用了! 删除引号规则如下(BAT兄补充!) 1、若字符串首尾同时存在引号,则删除首尾的引号; 2、若字符串尾不存在引号,则删除字符串首的引号; 3、如果字符串中间存在引号,或者只在尾部存在引号,则不删除。 %~fI - 将 %I 扩展到一个完全合格的路径名 看例子: 把代码保存放在随便哪个地方,我这里就放桌面吧. FOR /F \"delims==\" %%i IN ('dir /b') DO @echo %%~fi pause 执行后显示内容如下 C:\\Documents and Settings\\Administrator\\桌面\est.bat C:\\Documents and Settings\\Administrator\\桌面\est.vbs 当我把代码中的 %%~fi直接改成%%i FOR /F \"delims==\" %%i IN ('dir /b') DO @echo %%i pause 执行后就会显示这些内容 test.bat test.vbs 通过对比,我们很容易就看出没有路径了,这就是\"将 %I 扩展到一个完全合格的路径名\"的作用 也就是如果%i变量的内容是一个文件名的话,他就会把这个文件所在的绝对路径打印出来,而不只单 单打印一个文件名,自己动手动实验下就知道了! 批处理教程(命令扩展符2/2) 2010年05月30日 星期日 20:12 %~dI - 仅将 %I 扩展到一个驱动器号 看例子: 代码如下,我还是放到桌面执行! FOR /F \"delims==\" %%i IN ('dir /b') DO @echo %%~di pause 执行后我CMD里显示如下 C: C: 我桌面就两个文件test.bat,test.vbs,%%~di作用是,如果变量%%i的内容是一个文件或者目录名,他就会把他这文件 或者目录所在的盘符号打印出来! %~pI - 仅将 %I 扩展到一个路径 这个用法和上面一样,他只打印路径不打印文件名字 FOR /F \"delims==\" %%i IN ('dir /b') DO @echo %%~pi pause 我就不打结果了,大家自己复制代码看结果吧,下面几个都是这么个用法,代码给出来,大家自己看结果吧! %~nI - 仅将 %I 扩展到一个文件名 只打印文件名字 FOR /F \"delims==\" %%i IN ('dir /b') DO @echo %%~ni pause %~xI - 仅将 %I 扩展到一个文件扩展名 只打印文件的扩展名 FOR /F \"delims==\" %%i IN ('dir /b') DO @echo %%~xi pause %~sI - 扩展的路径只含有短名 打印绝对短文件名 FOR /F \"delims==\" %%i IN ('dir /b') DO @echo %%~si pause %~aI - 将 %I 扩展到文件的文件属性 打印文件的属性 FOR /F \"delims==\" %%i IN ('dir /b') DO @echo %%~ai pause %~tI - 将 %I 扩展到文件的日期/时间 打印文件建立的日期 FOR /F \"delims==\" %%i IN ('dir /b') DO @echo %%~ti pause %~zI - 将 %I 扩展到文件的大小 打印文件的大小 FOR /F \"delims==\" %%i IN ('dir /b') DO @echo %%~zi pause %~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩展 到找到的第一个完全合格的名称。如果环境变量名 未被定义,或者没有找到文件,此组合键会扩展到 空字符串 这是最后一个,和上面那些都不一样,我单独说说! 把这些代码保存为批处理,放在桌面. FOR /F \"delims==\" %%i IN ('net.exe') DO @echo %%~$PATH:i pause 他的意思就在PATH变量里指定的路径里搜索net,exe文件(PATH变量是系统变量,他里面的值是用;号分离的路径),如果PATH变量的各路径下有net.exe则会把他所在绝对路径打印出来,如果PATH变量的各路径下没有找到net.exe就打印一个错误! 说白了,这个用法是在指定路径下搜索指定文件,有点类似2003下的where命令 批处理教程(参数的格式化) 2010年05月30日 星期日 20:12 例子1: echo %random% pause 将会显示一个5位的随机数,但是 echo %random:~2% pause 将会显示一个3位的随机数 例子2: 现在的时间是 15:28:15:15 echo %time:~2% pause 将会显示:28:15:15 意思就是~N会去掉将要显示的字符串的前n位数。 例子3: echo %time:~1,3% pause 上面的例子会显示5:2,这时因为~1去掉了小时的十位1,后面的3代表显示用~1处理后的剩下的前三位。 例子4: @echo off set /a aa=12345670 echo %aa:~1,3% pause 上面的例子会显示234,这说明这种方法可以截取指定字符,可怜的是只对数字和标点有效,连字母都无效。 例子5: @echo off set /a aa=12345670 echo %aa:~-3% pause 上面例子会显示0,意思就是他截取了数字的尾。 Call命令的“变量嵌套”和“变量延迟” 2010年05月30日 星期日 20:13 call命令是用来调用其他程序的。 要输出%a%需要这样写“echo %%a%%”,这样百分号会脱掉一个。 先以一个简单的echo作为引子: 例子1、 @echo off set a=b echo %a% echo %%a%% echo %%%a%%% echo %%%%a%%%% echo %%%%%a%%%%% pause 运行结果是: b %a% %b% %%a%% %%b%% 解说:不知道大家看没看出来问题。批处理中类似于这样的变量替换究竟是 如何进行的呢?我们姑且称之为“替换步骤” “替换步骤”大体分为两步: 第一步:当百分号“%”是偶数时(只按一边的百分号数目计算),变量将不被替换,其它的也不变。当百分号是奇数时(也只按一边的百分号数目计),最里层的“%a%”将被替换成变量的值,此时百分号数目将少了一个(只按一边计)。 第二步:第一步完成后,百分号就都是偶数了。好了,现在把百分号数目的一半脱掉,剩下的就是结果了。 拿本例的“echo %%%%%a%%%%%”为例说明一下。第一步,由于百分号有5个是奇数,因此最里层的%a%被其值代替,现在变为“%%%%b%%%%”;第二步,将百分号脱去一半,就变为“%%b%%”。怎么样,理解了吗? 例子2、 @echo off set a=b set b=c set c=d call echo %%%%%%%%a%%%%%%%% call echo %%%%%%%%%%%%%a%%%%%%%%%%%%% pause 运行结果是: %%a%% %%%b%%% 解说:由于有call的存在,“替换步骤”就会多进行一次。 以“call echo %%%%%%%%%%%%%a%%%%%%%%%%%%%”为例。 “替换步骤”第一次: 第一步:百分号有13个是奇数,因此最里层的“%a%”被其值b替换,此时为“%%%%%%%%%%%%b%%%%%%%%%%%%”,现在百分号数目为12个了。 第二步:将百分号数脱去一半,现在为“%%%%%%b%%%%%%”。 “替换步骤”第二次: 第一步: 百分号有6个是偶数,因此不替换。现在仍然是“%%%%%%b%%%%%%”。 第二步: 将百分号数脱去一半,现在为“%%%b%%%”。 结果就是“%%%b%%%”。 (如果有n个call那么就要进行n+1次“替换步骤”。) call命令在“变量延迟”中也遵循“替换步骤”。 例子: 我现在要将字符串str1的“superhero”部分替换为chess,在此我们用间接的方法实现。 @echo off set str1=mynameissuperhero set str2=supxrhxro set a=x call call set str3=%%%%str1:%%str2:%a%=e%%=chess%%%% echo %str3% pause 因为用了两个call,因此要进行3次“替换步骤”。 “替换步骤”第一次: 1、将“%a%”替换成“x”,结果为“%%%%str1:%%str2:x=e%%=chess%%%%”。 2、将百分号脱去一半,为“%%str1:%str2:x=e%=chess%%”。 “替换步骤”第二次: 1、将“%str2:x=e%”替换掉,结果为“%%str1:superhero=chess%%”。 2、将百分号脱去一半,为“%str1:superhero=chess%”。 “替换步骤”第三次: 1、将“%str1:superhero=chess%”替换掉,结果为“mynameischess”。 2、将百分号脱去一半(没的脱了),因此结果为“mynameischess”。 批处理教程(预处理命令) 2010年05月30日 星期日 20:14 一、预处理究竟要做什么? 根据我的经验,预处理要做的是变量值的替换和特殊符号的处理。究竟先执行哪个操作呢,我认为要先进行变量值的替换。理由有三: 1、 从逻辑上看 set var=2&echo %var% 类似于这样的语句,如果说先进行特殊符号处理的话,势必要先处理符号“&”,而“&”是用来连接两条命令的,这样一来该行就理所应当的被理解为两句,那么我们还要变量延迟干嘛。这里应该是先对变量var赋值,然后处理特殊符号“&”。 2、从运行结果看 @echo off set var=^^^> echo %var% pause 这句“set var=^^^>”首先也会被预处理,预处理之后var的值为 “^>”。 本例的输出结果是“>”,因此可以证明系统先将变量的值替换为 “^>”然后再处理特殊符号“^”。 3、从变量替换上看 @echo off set ^&var=hero echo %&var% pause 结果:显示“hero” 这也说明变量的替换先于特殊符号的处理。 二、启动了变量延迟之后预处理又是如何进行呢? 我的看法是这样的:如果语句中存在英文叹号“!”则会被预处理两次,其它情况仍然是预处理一次。由于脱字字符比较特殊,因此在此借助该符号写几个例子说明一下。 例子1:: @echo off echo !^^^^^> setlocal enabledelayedexpansion echo !^^^^^> pause 两个echo语句的结果不同。下面做一下分析: 对于第一个echo语句,变量延迟没有开启,进行预处理的时候该句 就被预处理为“echo !^^>”,这也就是输出的结果。由此可见预 处理只进行了一次。 对于第二个echo语句,此时变量延迟开启,由于有“!”存在,首 先进行一次预处理得到“echo !^^>”,再进行一次得到“echo ^> ”,结果也是如此。 之所以没有输出叹号,是因为开启了变量延迟,叹号就变为了特殊 符号。 例子2: @echo off setlocal enabledelayedexpansion set var=hero echo !var! pause 像这里的“echo !var!”不是没有被预处理,而是被预处理了两次 。看下面的这段代码就可以理解了。 @echo off setlocal enabledelayedexpansion set var=hero echo !var!^^^^^> pause 运行的结果为:“hero^>”。我们来分析一下,进行第一次预处理 时,由于“!var!”,因此先不替换变量值而进行特殊符号的处理 ,处理完后就成了“echo !var!^^>”;之后再进行一次预处理, 此时就要替换“!var!”了,处理完后就成了“echo hero^>”。 例子3: 我们再来看看当变量延迟开启时语句中不存在英文叹号的情况。 @echo off echo ^^^^^> setlocal enabledelayedexpansion echo ^^^^^> pause @echo off set var=hero echo %var%^^^^^> setlocal enabledelayedexpansion echo %var%^^^^^> pause 怎么样,也就是说如果没有“!”就不会进行第二次处理。 例子4: 对于!!型,特殊符号的处理是在变量替换之前进行的。 @echo off setlocal enabledelayedexpansion set ^&var=hero echo !&var! pause 这段代码运行结果是错误的。 @echo off setlocal enabledelayedexpansion set var=^& echo !var! pause 这段代码运行结果是正确的。 例子5: 既然都要处理符号,那么%%型和!!型的符号处理会不会是同一个过程? 既然都要处理符号,那么%%型和!!型的符号处理会不会是同一个过程? 三、call引出的一些问题 1、call与脱字字符 例子: @echo off set /p var= \"^^^^^^^^^^^^^^^^\" 请按任意键继续. . . 结果是否有些出乎意料?我们知道,系统在预处理时不会处理双引号 间的脱字字符,那就意味着是call命令将其后的脱字字符数量加了倍 。看来call命令和脱字字符还真有点“暧昧”。 例子2: @echo off set /p var= call本身的预处理,这样结果就为4个“^”。 这样就能解释下面的代码为什么会显示4个“^”。 @echo off call call call call echo ^^^^^^^^ pause 2、call与其它特殊字符 这里所说的“其它特殊字符”主要指&、>、|等。 这里请允许我自定义两个名词: 主预处理过程:系统本身预处理过程的总称,其中包括了%%型和!!型。 次预处理过程:由于call命令引起的预处理过程的总称。 “其它特殊字符”是在主预处理过程中被系统识别的,而在次预处理 过程中对这些符号的识别是有问题的。 例子1: @echo off call echo hero!^&pause pause 本例中,经过主预处理过程,&被识别为普通字符,而在次预处理过程 中符号&的识别将产生问题。正如《命令行参考》中提到的--不要在 call 命令中使用管道和重定向符号。(这倒不是说call语句中不能使 用那些符号,而是这些符号不能作为参数传递给call命令。) 这也从某种程度上说明某行语句的句子结构(一条还是多条)和功能 (是从定向输出还是其它)是在主预处理过程中确定的。 以上所有内容,只是我个人的看法,由于没有官方文档的支持,因 此仅供参考。 那么我们学了以上种种内容又有什么实际用途呢?我想,懂得了以上 道理就可以写出更加个性化的代码,同时也可以作为一种伪装术在实 际中应用。 @echo off set ^&=setlocal enabledelayedexpansion set ^^^^^hero=^^^^^&p set ^au=^^^au set ^^^^^^^^^=障眼法 %&% set ^^^^^se=^^^se! echo %^^^^%!%^^hero%!au%^se% mshta简介 2010年05月30日 星期日 20:14 mshta.exe,HTML Application HOST,HTML应用程序主机,hta文件解释器(也能解释html),就如同IE是html的解释器,CMD是批处理文件的解释器,WScript.exe、CScript.exe是vbs/js脚本的解释器。 mshta的命令行参数似乎并未公开,mshta /? 等方式得不到任何帮助信息。大家如果感兴趣可以去csdn或微软的msdn查查。 从网上我仅找到一个带参数的用法:mshta.exe /register,应该是用来注册mshta的某项功能(具体作用未知)。 mshta在一般的应用中都不需要什么特别的参数,如: mshta C:\est.hta mshta \"%cd%\est.html\" mshta http://bbs.verybat.org mshta about:blank mshta vbscript:alert(\"hello\")(window.close) mshta vbscript:msgbox(\"是否确定?\确认\")(window.close) mshta javascript:alert('hello');window.close(); mshta vbscript:CreateObject(\"Shell.Application\").MinimizeAll()(close) 注意,最后几例中的vbscript、javascript不是mshta自身的参数,而是一种协议,它同样可以直接在IE的地址栏中输入。这种协议使得IE、mshta等程序可以直接执行vbs/js语句而不需要将vbs/js语句放在html文件中。vbs/js语句当然要遵循vbs/js语法,照样使用vbs/js的各种对象、方法、属性、函数等,调用脚本宿主对象模型中的WScript.Shell、WScript.Network等(注意它们并不从属于vbs,要弄清楚它们的主人),还能调用脚本运行时对象(fso、dictionary等)及其他可以被Automation的COM组件(如Word.Application)。上面的msgbox就是vbs的函数,Shell.Application就是一个Automation类。 由于hta其实也就是html,所以在hta文件中同样可以使用HTML DOM(文档对象模型),如window、document等各种对象。上面的alert、close就是Window对象的方法。也可以调用ActiveX控件、asp对象,等等。 还是因为hta就是html,运行hta的mshta.exe是HTML应用程序主机,所以用mshta vbscript: 、mshta javascript: 等形式运行vbs/js语句时,不能调用WScript对象,因为WScript对象是脚本宿主(WSH)自身提供的对象(根对象),只有脚本主机WScript.exe、CScript.exe才能使用,mshta、IE这些解释器无法调用。很多脚本初学者人误以为WScript、WScript.Shell、WScript.Network甚至FSO等对象是vbs的对象,现在清楚事实了吧。所以使用WScript.Sleep方法是理所当然行不通的。但要延时我们可以用Window对象的setTimeout方法,参见:mshta调用setTimeout方法实现精确延时 由于hta被设计用于本地运行,所以权限比html高。用mshta打开html也比用IE打开能获得更高的权限。所以本机上的HTML文件中如果调用WScript.Shell等本地对象,用IE打开会出现安全警告(提示有“活动内容”什么的),用mshta打开一般就不会有任何提示和警告了。 WMI工具 2010年05月30日 星期日 22:06 wmitool下载地址 http://www.microsoft.com/downloads/details.aspx?FamilyID=30f853-1120-48db-8cc5-f2abWMI Code Creator v1.0 http://www.microsoft.com/downloads/details.aspx?FamilyID=2cc30a-ea15-4661-8da4-55bb 修复损坏的WMI 1.点击开始,点击运行,输入services.msc后回车。 2. 右键点击 Windows Management Instrumentation 服务,点击属性。 3. 在General 栏上,设置启动类型为 Disable 然后点击确定。 4. 右键点击Windows Management Instrumentation 服务,并点击停止。(如果服务已经停止的话,5. 定位到%windir%\\system32\\wbem目录。 6. 将子文件夹Repository 重命名为Repository.old。 7. 创建一个批处理文件,包含下面的信息: cd %windir%\\system32\\wbem for /f %%s in ('dir /b /s %windir%\\system32\\wbem\\*.dll') do regsvr32 /s %%s for /f %%s in ('dir /b /s %windir%\\system32\\wbem\\*.mof') do mofcomp %%s 8. 将该文件保存到 c:\\rebuildwmi.bat 。 9. 双击运行这个bat文件 10. 等待命令的完成,如果此过程提示找不到文件,那么就在另一台电脑上拷贝此目录覆盖你的文11. 注意:次命令会运行数分钟,耐心等待! 12. 打开服务MMC 。 13. 右键点击 Windows Management Instrumentation 服务,点击属性。 14. 在General 栏上,设置启动类型为Automatic 然后点击确定。 15. 启动Windows Management Instrumentation 服务。 16.重新启动电脑,问题解决! 删除系统保留名型目录的方法(AUX,COM1,COM2,PRN,CON,NUL) 2010年05月01日 星期六 19:22 Windows 下不能够以下面这些字样来命名文件/文件夹,包括: “aux”“com1”“com2”“prn”“con”和“nul”等,因为这些名字都属于设 备名称,等价于一个 DOS 设备,如果我们把文件命名为这些名字,Windows 就会误以为发生重名,所以会提示“不能创建同名的文件”等等。 阅读全文>> 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo8.com 版权所有 湘ICP备2023022238号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务