显示执行命令(除echo)和执行结果,命令将显示当前回显设置

不论在写shell,因此shell脚本、bat脚本文件就必不可少了,命令将显示当前回显设置,echo,显示执行命令(除echo)和执行结果,on和echo off两个命令了,直接执行echo命令将显示当前echo命令状态(off或on)执行echo,off将关闭回显

图片 1

Windows cmd

一.简单批处理内部命令简介
1.Echo 命令
打开回显或关闭请求回显功能,或显示消息。如果没有任何参数,echo
命令将显示当前回显设置。
语法
echo [{ on|off }] [message]
Sample:@echo off / echo hello world
在实际应用中我们会把这条命令和重定向符号(也称为管道符号,一般用>
>>
^)结合来实现输入一些命令到特定格式的文件中.这将在以后的例子中体现出来。

windows bat(批处理)——基础语法

1、@
它的作用是隐藏它后面这一行的命令本身(只能影响当前行)。
2、echo
中文为“反馈”、“回显”的意思。它其实是一个开关命令,就是说它只有两种状态:打开和关闭。于是就有了echo
on和echo
off两个命令了。直接执行echo命令将显示当前echo命令状态(off或on)执行echo
off将关闭回显,它后面的所有命令都不显示命令本身,只显示执行后的结果。
echo.
:输出空行,即相当于输入一个回车;值得注意的是命令行中的“.”要紧跟在ECHO后面中间不能有空格,否则“.”将被当作提示信息输出到屏幕。另外“.”可以用,:;”/[\]+等任一符号替代。

对于跨平台的程序,通常会提供一些有用的命令行工具,因此shell脚本、bat脚本文件就必不可少了。网络上shell的书、文章都不少的,所以了解起来会相对容易的多,而windows下的bat网上则少有涉及。这里不打算写windows
bat 编程大全,而是简单对bat做一个简单的入门级的学习。

2.@ 命令
表示不显示@后面的命令,在入侵过程中(例如使用批处理来格式化敌人的硬盘)自然不能让对方看到你使用的命令啦。
Sample:@echo off
@echo Now initializing the program,please wait a minite…
@format X: /q/u/autoset (format
这个命令是不可以使用/y这个参数的,可喜的是微软留了个autoset这个参数给我们,效果和/y是一样的。)

 

3、start 命令
调用外部程序,所有的DOS命令和命令行程序都可以由start命令来调用。
start /wait :
start命令会启动软件的安装程序,而/wait命令会让系统在处理批处理文件中的下一条命令之前等待前一个软件安装完成。使用/wait命令是很重要的,只有这样才不会让批处理文件中的所有命令一下子全部执行起来,那样将会导致同一时间运行多个软件的安装程序。
如:几秒钟让你的内存耗尽(例一):
@Echo off
Start
cmd:开启CMD程序)
%0
4、pause
中文为“暂停”的意思。它的作用,是让当前程序进程暂停一下,并显示一行信息:请按任意键继续.
. .。我们可以加 >nul把这个信息隐藏。
5、:和goto
为什么要把这两个命令联合起来介绍?因为它们是分不开的,无论少了哪个或多了哪个都会出错。goto是个跳转命令,:是一个标签。当程序运行到goto时,将自动跳转到:定义的部分去执行了。如:为你的右键添加P处理(例二)
@echo off
echo 输入 1 后按回车键, 添加右键P处理
echo 输入 2 后按回车键, 退出
echo.
set /p start=请选择 (1、2) 后按回车键:
if “%start%”==”1” goto 1
if “%start%”==”2” goto 2
:1
@echo off
color 1a
reg add HKCR\.bat\ShellNew /v nullfile /f >nul
reg add HKCR\batfile /ve /d P处理 /f >nul
exit
:2
Exit
6、%
这个百分号严格来说是算不上命令的,它只是批处理中的参数。
%[1-9]表示参数,参数是指在运行批处理文件时在文件名后加的以空格(或者Tab)分隔的字符串。变量可以从%0到%9,%0有两个意义
一是表示批处理命令本身,还一个就是无限循环,其它参数字符串用%1到%9顺序表示。
如:
%0表示批处理命令本身
新建一个1.BAT文件。输入以下内容:
@echo off
del
%0
pause
大家看效果,1.BAT已经被删除了。
还一个意思无限循环!如例一。无限执行start cmd 这条命令!
%1、%2……的意思:
例:@echo off
echo %1 %2 %3
echo %1
echo %2
echo %3
进入CMD,输入cd c:\
然后输入 test.bat 我是第一个参数
我是第二个参数
我是第三个参数
注意中间的空格,我们会看到这样的结果:
我是第一个参数
我是第二个参数
我是第三个参数
我是第一个参数
我是第二个参数
我是第三个参数
对比下代码,%1就是我是第一个参数 %2就是我是第二个参数
还有一个%* 
 他是什么呢?他的作用不是很大,只是返回参数而已,不过他是一次返回全部参数的值,不用在输入%1
%2来确定一个个的
例子
@echo off
echo %*
同样保存为test.bat 放到C盘
进入CMD,输入cd c:\
然后输入 test.bat 我是第一个参数
我是第二个参数
我是第三个参数
我是第四个参数
可以看到他一次把全部参数都显示出来了
现在说自定义变量
故名思意,自定义变量就是由我们来给他赋予值的变量;要使用自定义变量就得使用set命令了,看例子.
@echo off
set var=我是值
echo %var%
pause
保存为BAT执行,我们会看到CMD里返回一个   “我是值”
var为变量名,=号右边的是要给变量的值
这就是最简单的一种设置变量的方法了
如果我们想让用户手工输入变量的值,而不是在代码里指定,可以用用set命令的/p参数
例子:
@echo off
set /p var=请输入变量的值
echo %var%
pause
var变量名 
 =号右边的是提示语,不是变量的值。变量的值由我们运行后自己用键盘输入!
7、if
if命令是一个表示判断的命令,根据得出的每一个结果,它都可以对应一个相应的操作。

不论在写shell,还是bat,它们的设计都遵守这样一条原则:一切都是命令。Windows下命令是大小写不敏感的。

3.Goto 命令
指定跳转到标签,找到标签后,程序将处理从下一行开始的命令。
语法:goto label (label是参数,指定所要转向的批处理程序中的行。)
Sample:
if { %1 }=={ } goto noparms
if { %2 }=={ } goto
noparms(如果这里的if、%1、%2你不明白的话,先跳过去,后面会有详细的解释。)
@Rem check parameters if null show usage
:noparms
echo Usage: monitor.bat ServerIP PortNumber
goto end
标签的名字可以随便起,但是最好是有意义的字母啦,字母前加个:用来表示这个字母是标签,goto命令就是根据这个:来寻找下一步跳到到那里。最好有一些说明这样你别人看起来才会理解你的意图啊。

  1. @

(1)、输入判断

 

4.Rem 命令
注释命令,在C语言中相当与/*——–*/,它并不会被执行,只是起一个注释的作用,便于别人阅读和你自己日后修改。
Rem Message
Sample:@Rem Here is the description.

行首有了它的话,这一行的命令就不显示了。

if “参数” == “字符串”  待执行的命令

基本命令(rem, echo, @,/?)

rem:注释 (comment, remarks)。参数可以是任何内容。

echo :它有两个功能:打印消息、调试开关。如果参数是on
或者off,代表打开、关闭调试,如果后面是其它内容,则参数代表要输出的消息。为什么说是debug开关呢?如果设置了echo
on,随后执行的任何命令及其执行结果都会输出到标准输出流。

@用于关闭某个命令的调试信息,意思是说使用@标注的命令不会打出命令本身、执行结果。

/? 查看命令帮助

例如:

REM open the cmd echo
@echo on
echo hello, windows cmd 
@echo hello, windows cmd 

REM close the cmd echo
@echo off
echo hello, windows cmd 
@echo hello, windows cmd

 

执行结果: 

D:\Note\windows cmd>REM open the cmd echo

D:\Note\windows cmd>echo hello, windows cmd
hello, windows cmd
hello, windows cmd

D:\Note\windows cmd>REM close the cmd echo
hello, windows cmd
hello, windows cmd

 

对于REM的命令,也是会打到STD里,如果不希望看到,就可以使用@标注。 

 

 

5.Pause 命令

  1. echo

  参数如果等于指定的字符串,则条件成立,运行命令,否则运行下一句。(注意是两个等号)

控制命令(if-else, for-in-do, goto)

 

运行 Pause 命令时,将显示下面的消息:
Press any key to continue . . .
Sample:
@echo off
:begin
copy a:*.* d://back
echo Please put a new disk into driver A
pause
goto begin
在这个例子中,驱动器 A
中磁盘上的所有文件均复制到d://back中。显示的注释提示您将另一张磁盘放入驱动器
A 时,pause 命令会使程序挂起,以便您更换磁盘,然后按任意键继续处理。

2.1  echo [{on|off}] [message]

  如if “%1″==”a” format a:
再如例二。

if-else

 

if [noterrorlevel number command [else expression] 基于上一个命令执行的结果进行判定操作

if [notstring1==string2 command [else expression] 判定两个字符串是否相等

if [notexist FileName command [else expression]  判定指定的文件是否存在

If command extensions are enabled, use the following syntax:

if [/istring1 CompareOp string2 command [else expression] 进行字符串比较 (equ, neq, lss, leq, gtr, geq)

if cmdextversion number command [else expression]

if defined variable command [else expression]

 

 

 

6.Call 命令
从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。call
命令接受用作调用目标的标签。如果在脚本或批处理文件外使用
Call,它将不会在命令行起作用。
语法
call [[Drive:][Path] FileName [BatchParameters]] [:label
[arguments]]
参数
[Drive: }[Path] FileName
指定要调用的批处理程序的位置和名称。filename 参数必须具有 .bat 或 .cmd
扩展名。

输出,回显。

(2)、存在判断。例:
if exist C:\Progra~1\Tencent\AD\*.gif del
C:\Progra~1\Tencent\AD\*.gif
如果存在那些gif文件,就删除这些文件。注意,这里的条件判断是判断存在的,当然也可以判断不存在的,例如下面这句“如果不存在那些gif文件则退出脚本”:if
not exist C:\Progra~1\Tencent\AD\*.gif
exit。只是多一个not来表示否定而已。
(3)、结果判断。例:
masm %1.asm
if errorlevel 1 pause & edit %1.asm
link %1.obj
这种用法是先判断前一个命令执行后的返回码(也叫错误码,DOS程序在运行完后都有返回码),如果和定义的错误码符合(这里定义的错误码为1),则执行相应的操作(这里相应的操作为pause
& edit %1.asm部分)。
8、call
在批处理脚本中,call命令用来从一个批处理脚本中调用另一个批处理脚本。
9、find
这是一个搜索命令,用来在文件中搜索特定字符串,通常也作为条件判断的铺垫程序。这个命令单独使用的情况在批处理中是比较少见的,因为没什么实际意义。
下例中,如果不使用type命令列出a.txt中的内容,而是直接使用find命令在a.txt中找“8000”,就必须得给出这个a.txt的绝对路径,如果没有指定路径,find将搜索键入的或者由另一个命令产生的文字。这里的“另一个命令”指的就是type命令了。
@echo off
cd\
netstat -an > a.txt
type a.txt | find “8000” && echo “Congratulations! You have infected
灰鸽子!”
del a.txt
pause & exit

For-in-do

循环执行,命令语法:

for {%variable | %%variable} in (set) do command [CommandLineOptions]

1)For, in, do 是基本结构,必不可少;

2){%variable | %%variable} 必要的,变量大小写敏感。

在命令提示符中执行for时,for中引用变量时,使用%

在批处理文件中执行for时,for中引用变量时,使用%%

此外,为了避免与bat文件的参数 %0到 %9相冲突,所以变量不能是0-9的数字

3)( set ) 必要的。用于指定多个 files, directories, range of values,
textstrings。括号不能省。

 

4)command 必要的,代表要执行的命令。

5)commandLineOptions, 执行command时所需的参数

 

更多用法,可能参考:

 

 

7.start 命令
调用外部程序,所有的DOS命令和命令行程序都可以由start命令来调用。
入侵常用参数:
MIN 开始时窗口最小化
SEPARATE 在分开的空间内开始 16 位 Windows 程序
HIGH 在 HIGH 优先级类别开始应用程序
REALTIME 在 REALTIME 优先级类别开始应用程序
WAIT 启动应用程序并等候它结束
parameters 这些为传送到命令/程序的参数
执行的应用程序是 32-位 GUI 应用程序时,CMD.EXE
不等应用程序终止就返回命令提示。如果在命令脚本内执行,该新行为则不会发生。
8.choice 命令
choice
使用此命令可以让用户输入一个字符,从而运行不同的命令。使用时应该加/c:参数,c:后应写提示可输入的字符,之间无空格。它的返回码为1234……
如: choice /c:dme defrag,mem,end
将显示
defrag,mem,end[D,M,E]?
Sample:
Sample.bat的内容如下:
@echo off
choice /c:dme defrag,mem,end
if errorlevel 3 goto defrag (应先判断数值最高的错误码)
if errorlevel 2 goto mem
if errotlevel 1 goto end

2.2 on | off

10、for

goto

语法:goto label

跳转到指定的label。如果指定的label不存在,就继续执行下一条命令。如果找到label,就从label处继续执行。如果程序以正常顺序执行到一个label处,而不是通过goto跳转到label,label下的语句仍旧以正常顺序执行。

 

图片 1 

 

 

想要了解更多指令参见:

 

 

 

 

 

 

 

:defrag
c://dos//defrag
goto end
:mem
mem
goto end
:end
echo good bye

它其实是一个开关命令,就是说它只有两种状态:打开和关闭。于是就有了echo
on和echo off两个命令了。

循环命令,只要条件符合,它将多次执行同一命令。
语法:FOR %%variable IN (set) DO command [command-parameters]
对一组文件中的每一个文件执行某个特定命令。
%%variable 指定一个单一字母可替换的参数。 (set)
指定一个或一组文件。可以使用通配符。
command
指定对每个文件执行的命令。

此文件运行后,将显示 defrag,mem,end[D,M,E]? 用户可选择d m e
,然后if语句将作出判断,d表示执行标号为defrag的程序段,m表示执行标号为mem的程序段,e表示执行标号为end的程序段,每个程序段最后都以goto
end将程序跳到end标号处,然后程序将显示good bye,文件结束。

(1)echo off

command-parameters
为特定命令指定参数或命令行开关。
例如一个批处理文件中有一行:
for %%c in (*.bat *.txt) do type %%c
则该命令行会显示当前目录下所有以bat和txt为扩展名的文件的内容。

9.If 命令

只显示执行结果

FOR %%a IN ( C: D: E: F: G: H: ) DO ATTRIB -R -H -S %%a\SXS.EXE & DEL
/F /Q /A -R -H -S %%a\SXS.EXE & ATTRIB -R -H -S %%a\AUTORUN.INF & DEL
/F /Q /A -R -H -S %%a\AUTORUN.INF

if 表示将判断是否符合规定的条件,从而决定执行不同的命令。 有三种格式:

(2)echo on (默认)

该命令删除根目录下所有SXS.EXE和AUTORUN.INF文件.

1、if “参数” == “字符串” 待执行的命令
参数如果等于指定的字符串,则条件成立,运行命令,否则运行下一句。(注意是两个等号)
如if “%1″==”a” format a:
if { %1 }=={ } goto noparms
if { %2 }=={ } goto noparms

显示执行命令(除echo)和执行结果

 在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable 而不要用
%variable。直接在命令行则只需要一个%号。变量名称是区分大小写的,所以 %i
不同于 %I

2、if exist 文件名 待执行的命令
如果有指定的文件,则条件成立,运行命令,否则运行下一句。
如if exist config.sys edit config.sys

(3)> 输出重定向

11、SET

3、if errorlevel / if not errorlevel 数字 待执行的命令
如果返回码等于指定的数字,则条件成立,运行命令,否则运行下一句。
如if errorlevel 2 goto x2
DOS程序运行时都会返回一个数字给DOS,称为错误码errorlevel或称返回码,常见的返回码为0、1。

创建或清空文件,然后把数据输出到文件

显示、设置或删除 cmd.exe 环境变量。 

10.for 命令
for 命令是一个比较复杂的命令,主要用于参数在指定的范围内循环执行命令。
在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable

echo hi > a.txt

要显示当前环境变量,键入不带参数的 SET。

for { %variable|%%variable } in (set) do command [
CommandLineOptions]
%variable 指定一个单一字母可替换的参数。
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters 为特定命令指定参数或命令行开关。
在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable
而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I

把数据追加到文件

/P
命令行开关允许将变量数值设成用户输入的一行输入。读取输入行之前,显示指定的
promptString。promptString 可以是空的。

如果命令扩展名被启用,下列额外的 FOR 命令格式会受到
支持:

echo this is a text >>a.txt

/A
命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式评估器很简单并以递减的优先权顺序操作。

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

 

如: set /p start=请选择 (1、2、3) 后按回车键:

如果集中包含通配符,则指定与目录名匹配,而不与文件
名匹配。

echo hi > a.txt

if “%start%”==”1” goto 1

FOR /R [[drive:]path] %variable IN (set) DO command [command-

type a.txt

if “%start%”==”2” goto 2

检查以 [drive:]path 为根的目录树,指向每个目录中的
FOR 语句。如果在 /R 后没有指定目录,则使用当前
目录。如果集仅为一个单点(.)字符,则枚举该目录树。

echo this is a text >>a.txt

if “%start%”==”3” goto 3
管道命令:
1、|
它的作用,就是把前一命令执行的结果传到后一命令去处理。
如:help | more
回车后会发现显示满一屏幕后就自动暂停,等候继续显示其他信息。当按写回车时,变成一个一个的出现;按下空格键时一屏幕一屏幕显示,直到全部显示完为止;按其他键自动停止返回DOS。
这里结合了管道命令|和DOS命令more来共同达到目的的。
2、>、>>
这两个命令的效果从本质上来说都是一样的,他们都是输出重定向命令,说的通俗一点,就是把前面命令的输出写入到一个文件中。这两个命令的唯一区别是,>会清除掉原有文件中的内容后把新的内容写入原文件,而>>只会另起一行追加新的内容到原文件中,而不会改动其中的原有内容。
3、<
<,输入重定向命令,从文件中读入命令输入,而不是从键盘中读入。
例:sort < list.txt > alphlist.txt
sort 命令按字母顺序排列文本文件或命令的输出。在此范例中,sort 命令对
List.txt 文件的行进行排序并显示结果,但不更改文件。并将结果存到
Alphlist.txt 文件中。
组合命令:
顾名思义,就是可以把多个命令组合起来当一个命令来执行。这在批处理脚本里是允许的,而且用的非常广泛。它的格式很简单—-既然现在已经成了一个文件了,那么这多个命令就要用这些组合命令连接起来放在同一行—-因为批处理认行不认命令数目。
1、&
这可以说是最简单的一个组合命令了,它的作用是用来连接n个DOS命令,并把这些命令按顺序执行,而不管是否有命令执行失败。如:copy
a.txt b.txt /y & del a.txt
2、&&
这个命令可以把它前后两个命令组合起来当一个命令来用,与&命令不同之处在于,它在从前往后依次执行被它连接的几个命令时会自动判断是否有某个命令执行出错,一旦发现出错后将不继续执行后面剩下的命令。这就为我们自动化完成一些任务提供了方便。(当然这个和IF命令差不多,可以自己选择喜欢的方式)
小提示:有些命令是不能同时执行的
如:出道题:把C盘和D盘的文件和文件夹列出到a.txt文件中。
有人说,同时执行两个dir,然后把得到的结果>到a.txt里就ok了嘛:
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
当然这里还可以利用&命令:dir c:\ > a.txt & dir d:\ >> a.txt
3、||
这个命令的用法和&&几乎一样,但作用刚好和它相反:利用这种方法在执行多条命令时,当遇到一个执行正确的命令就退出此命令组合,不再继续执行下面的命令。
题目:查看当前目录下是否有以s开头的exe文件,如果有则退出。例:
@echo off
dir s*.exe || exit
其实这个例子是有破绽的,如果存在那个exe文件,就退出;如果不存在那个exe文件,也退出!为什么?因为如果不存在那个.exe文件,则前一条命令dir
s*.exe执行肯定是不成功的,所以就继续执行exit,自然就退出了。那么如何解决题目给出的问题呢?看下例:
@echo off
dir s*.exe || echo Didn’t exist file s*.exe & pause & exit
这样执行的结果,就能达到题目的要求,是否存在s*.exe将出现两种结果。这里加暂停的意思,当然是让你能看到echo输出的内容,否则一闪而过的窗口,echo就白写了。
几个符号:
1、符号(” “)
  ”
“符号允许在字符串中包含空格。进入一个特殊的目录可以用如下方法.例:
c:\>cd “Program Files”
c:\>cd progra~1
c:\>cd pro*
  以上方法都可以进入Program Files目录
2、符号(,)
  ,符号相当于空格。在某些特殊的情况下可以用,来代替空格使用。例:
c:\>dir,c:\
3、符号(;)
  ;符号当命令相同的时候可以将不同的目标用;隔离开来但执行效果不变。如执行过程中发生错误则只返回错误报告但程序还是会继续执行。例:DIR
C:\;D:\;E:\F:\
以上的命令相当于
DIR C:\
DIR D:\
DIR E:\
DIR F:\
4、符号“::”
这个符号的作用很简单,它是注释命令,在批处理脚本中和rem命令等效。它后面的内容在执行时不显示,也不起任何作用,因为它只是注释,只是增加了脚本的可读性。与rem
不同的是, ::后的字符行在执行时不会回显,无论是否用echo
on打开命令行回显状态。
5、符合“^”
^是对特殊符号”<“,”>”,”&”的前导字符,在命令中他将以上3个符号的特殊功能去掉,仅仅只把他们当成符号而不使用他们的特殊意义。
比如echo test ^>1.txt
结果则是他没有追加在1.txt里,只是显示了出来

FOR /L %variable IN (start,step,end) DO command [command-para

type a.txt

每天早上敲醒自己的不是闹钟,是夢想!

该集表示以增量形式从开始到结束的一个数字序列。

 

使用批处理文件

  1. 注释

——常用命令

:: 或 rem

echo、@、call、pause、rem
是批处理文件最常用的几个命令,我们就从他们开始学起。 echo
表示显示此命令后的字符
echo off 表示在此语句后所有运行的命令都不显示命令行本身
@ 与echo
off相象,但它是加在其它命令行的最前面,表示运行时不显示命令行本身。
call 调用另一条批处理文件(如果直接调用别的批处理文件
,执行完那条文件后将无法执行当前文件后续命令)
pause 运行此句会暂停,显示Press any key to continue…
等待用户按任意键后继续
rem 表示此命令后的字符为解释行,不执行,只是给自己今后查找用的