DOS命令及批处理

前言:为什么会接触批处理?前几天要选课了,朋友给了我一个python写的抢课脚本,这个脚本有一个小问题就是一旦网络不好,没能及时得到学校服务器的回复就会终止。我又得手动运行脚本,并输入一堆网址、课程名、学号、密码等一堆信息,很浪费时间。所以我就去学了下批处理,然后写了个让python程序无限循环的bat脚本~

批处理只是一个小工具,而且还是一个已经快没什么人用的小工具了,所以感兴趣的话就随便学学,知道它是干啥的,要用的时候再学就好了

本文佛系更新~

一.概述

1.命令行

命令行是一种人机交互的方式,即用户通过键盘输入字符指令,计算机在控制台输出处理结果。

目前,大部分用户都在使用图形化界面来进行创建、移动、重命名、删除文件等操作;命令行则是另一种操作文件的模式,用户通过输入指令来操作文件。比如用户在控制台上输入命令:COPY A B,表示复制文件A并将其存放到目录B中。

我们常常将诸如COPY A B这样的命令叫做DOS命令,这得归结于历史原因。

DOS,Disk Operation System,即磁盘操作系统 。

值得一提的是,DOS 是一种操作系统,是和 Windows 同一个概念的存在:

  1. Windows 曾经只是一个图形界面程序,运行在DOS的基础上

  2. 自Windows95开始,Windows 就是一个独立的操作系统,但内核还是DOS,和DOS共享部分代码

  3. 自Windows XP 开始,就已经告别了 DOS,但是仍然可以通过一个名为cmd.exe的命令行辅助工具,在其上输入DOS命令来对文件进行操作。命令的用法没变,所以仍然称为DOS命令;但实质上不是通过DOS来实现对文件的操作了。

DOS系统目前已经没有什么人使用了,但是在我们使用的 Windows系统中仍然可以通过DOS命令来操作文件。

Windows下进入命令行的方法: win + R 键打开运行窗口,键入cmd 即可。

梳理一下各个概念:

  1. 命令行和图形化界面是两种人机交互的方式,前者在控制台上输入命令、后者主要通过鼠标来操作文件
  2. DOS 是曾经的一种磁盘操作系统,Windows中虽然已经不使用DOS了,但仍然继承了DOS命令集
  3. cmd.exe 是一个可执行程序,是Windows系统中实现命令行的软件。

为什么要学习命令行:

  1. 大部分的DOS命令都已经在Windows里都能通过可视化界面实现,更为直观;但是有一些高级的DOS命令还是要在DOS环境下来执行。
  2. 熟练之后命令行之后,操作起来其实比图形化界面快

2.批处理文件

批处理是什么:

批处理文件是指文件后缀名为.bat的文件。在 DOS 或 Windows 系统中,.bat 文件是可执行文件(点击就可以运行,就像.exe文件一样),文件的每一行都是一条DOS命令(大部分时候就和在命令行中键入的命令一样),按顺序自动执行所以称为批处理。

批处理的作用:

批处理文件可以大大节省命令反复输入的繁琐。频繁要用到的命令都可以写到批处理文件中,点击即可运行。

同时批处理文件还有一些编程的特点,可以通过扩展参数来灵活的控制程序的执行,所以在日常工作中非常实用。

批处理的后缀:

批处理文件起源于DOS时代,在DOS时代的扩展名为.bat(即是batch的缩写),只要使用文本编辑器就能对其进行编辑,经过时代的发展,批处理文件已经同时支持Windows环境程序的运行,在Windows NT以后的平台中,还加入了以.cmd为扩展名的批处理文件,其性能比.bat文件更加优越,执行也与.bat文件一样方便快捷,并且还支持比 .bat文件更多的命令。

3.第一个批处理程序

  1. 创建一个文本文件

  2. 输入代码:

    @echo Hello World!
    pause
    
  3. 将文件后缀名改为 .bat 或 .cmd

  4. 点击运行,结果如下:

在这里插入图片描述

和我们打开命令行在键入DOS命令所实现的效果一样

二.语法

首先需要明确的是,Windows命令行中不区分大小写

注:不要死磕命令的语法,熟能生巧即可

1.echo 和 @

echo 是一个英文单词,表示回声,即你给它什么就还给你什么,可以理解为输出语句。如:

  1. echo Hello World! 就在屏幕上输出Hello World!

  2. echo. 输出一个"换行符",注意echo 和 . 之间没有空格,否则就是输出一个点了

回显:运行批处理文件时,会在屏幕上显示当前正在处理的命令;若关闭回显,则只会显示每条命令的处理结果。

echo Hello World!
pause

结果如下:

在这里插入图片描述

值得一提的是,批处理文件在运行完后会关闭控制台,如果没有 pause 命令就是一个黑框框一闪而过的效果

可以发现,要运行的每条命令都会显示在控制台上,且命令的前面还跟着一个路径和一个用于分隔的 > 。

回显相关的命令如下:

命令描述
@关闭单行(本行)回显
echo off从下一行开始关闭回显(不包括echo off本身)
@echo off从本行开始关闭回显。一般批处理第一行都是这个
echo on从下一行开始打开回显
echo显示当前是 echo off 状态还是 echo on 状态

2.rem 和 ::

rem为remark的缩写,一般用来给程序添加注释,该命令后的内容不被执行,但可以回显。

:: 也可以起到注释作用, 而且更简洁有效,但::后的字符行在执行时不会回显,无论是否用echo on打开命令行回显状态,因为命令解释器不认为这是一个有效的命令行, 就此点来看, rem 在某些场合下将比 :: 更为适用

3.pause

pause表示暂停,当批处理文件运行到这一行时会暂时停止,按下任意键后继续。

在C语言的<stdlib.h>头文件中,可以通过system('pause')语句来调用DOS 系统中的pause命令。这样一来理清楚了,原来C程序运行后出现的黑窗口就是Windows的命令行窗口呀

4.目录相关命令

windows的磁盘采用树形结构,一个目录下不能存在文件名相同的文件,但是不同目录中就可以。所以标识一个文件的应当是文件路径(即文件所在目录)+ 文件名

①dir 命令:directory的缩写,可以显示目录下的文件列表,目录也就是文件夹的意思

值得一提的是 .表示当前目录,..表示上一级目录

关于dir命令的更详细用法可以在命令行中输入help dirdir /?来查看

此外,tree 命令可以树形显示目录结构,直接输入c:可以切换盘符到C盘

②md 命令:是make directory 的缩写,可以创建目录(文件夹)

md abc :在当前目录下建立子目录 abc

③cd 命令:,是change directory 的缩写,可以更改当前所处目录

命令解释
cd mp3进入当前目录中的mp3 目录
cd …进入当前目录中的上级目录
cd\进入根目录(cd 和 \ 之间可以加空格)
cd显示当前目录
cd /d d:\mp3可以同时更改盘符和目录

当前所处目录的主要意义就在于,可以直接对目录下的文件进行操作,而想操作的别的文件要使用绝对路径

  • 绝对路径:文件在硬盘上真正存在的路径

  • 相对路径:相对于自己的目标文件位置

注1:windows中 /\的含义是等价的,所以cd /也表示进入根目录

注2:更换盘符(如从C盘去往D盘下)需要加上/d选项

ps:这里提到了选项的概念,一个命令后面往往跟着参数,即命令操作的对象,如echo 要打印的内容;同时命令还可以加选项,用来扩充命令的功能,一个命令往往由命令名+参数+选项这三部分组成。

④rd 命令:是remove directory 的缩写,可以删除目录

rd abc : 删除当前目录里的 abc 子目录,要求 abc 为空目录,删除前需要按Y确认

rd /s/q abc 增加/s/q两个选项,可以删除 abc 文件夹及其子文件夹和文件,且不需要按 Y 确认

5.errorlevel

errorlevel 表示程序返回码。

可以通过echo %errorlevel%来查看上一条命令的返回码,用于判断刚才的命令是否执行成功:

  • 若命令执行成功,则errorlevel为0
  • 若命令执行出错,则 errorlevel 为1

例:

echo HelloWorld!
echo %errorlevel%
cd hahaha
echo %errorlevel%
pause

运行结果:

在这里插入图片描述

其中, cd hahaha命令由于桌面上不存在hahaha这个文件夹而失败

两个%括起来的内容在批处理文件中表示变量,errorlevel 确实是个在不断变化的变量。。。

6.文件相关命令

①del 命令:delete 的缩写,用于删除文件
del d:\test.txt ,删除指定文件,但不能是隐藏、系统、只读文件

多个要删除的文件名可以用逗号,空格或分号隔开。

此外,还可以使用通配符来一次性删除多个文件:

del *.* 删除当前目录里的所有文件,不包括隐藏、系统、只读文件。(因为windows的文件名中都含有后缀名,所以用*.*可以匹配所有文件)

为避免误删,都是要求按 Y 确认的,和 rd 一样

选项描述
/q静音状态,不提示您是否确认删除
/f强制删除只读文件

②ren 命令:rename的缩写,用于文件重命名
ren 1.txt 2.bak :把 1.txt 更名为 2.bak

ren *.txt *.ini :把当前目录里所有.txt文件改成.ini文件

ren d:\temp tmp :也可以对文件夹重命名

命令行中批量重命名的效率,显然比图形化界面要高

③copy 命令 : 拷贝文件
copy c:\test.txt d:\ :复制 c:\test.txt 文件到 d:\,前者为文件,后者为目录

copy c:\test.txt d:\test.bak : 复制 c:\test.txt 文件到 d:\ ,并重命名为 test.bak

copy c:\*.* : 复制 c:\ 所有文件到当前目录,不包括隐藏文件和系统文件不指定目标路径

copy con test.txt :con 即 console ,从控制台等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件

注:con代表控制台,prn代表打印机,nul代表空设备

copy 1.txt + 2.txt 3.txt :合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件如果不指定 3.txt ,则保存到 1.txt

**④type 命令 :**显示文件内容
type c:\boot.ini :显示指定文件的内容,即在控制台上显示文件内容

type *.txt : 显示当前目录里所有.txt文件的内容

⑤more 命令 :逐屏显示外部文件内容

more c:\test.txt :逐屏显示 c:\test.txt 的文件内容

7.控制台相关

①cls 命令 :clean screen,表示清屏

这个在批处理文件中感觉也没啥意义,在命令行中敲命令时倒是会用到。当初做C语言课设时,倒是使用这个来实现过类似“换页”的效果。

②title 命令 :设置cmd窗口的标题
title 新标题 :可以看到cmd窗口的标题栏变了

8.goto 和 :

  1. :label 当行首为:表示该行是标签行,标签行本身不执行操作

    注意只有:后跟着的是字母时才能被goto识别,否则就无意义。这也是::之所以能表示注释的原因,其实:+:-:*都可以作为注释。

  2. goto label :跳转到指定的标签那一行

9. find

find 命令可以在外部文件中查找指定字符串是否存在

格式:find "要查找的字符串" 要查找的文件

  1. find "abc" c:\test.txt:在 c:\test.txt 文件里查找含 abc 字符串的行,若找不到 errorlevel 为1

  2. find /i "abc" c:\test.txt:i是ignore 的缩写,查找含 abc 的行时忽略大小写。

  3. find /c "abc" c:\test.txt :c是count的缩写,仅显示有多少行含 abc

10.&&和||

多条命令可以通过 & 或 && 或 || 连接起来,实现或和且的效果。

  1. & :顺序执行多条命令,而不管命令是否执行成功

    c: & cd\ & dir /w相当于把下面3行命令写到1行去了c:cd\dir /w

  2. &&:顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
    f: && cd\ && dir >c:\test.txt:注意如果f盘不存在,那么后面2条命令将不会执行
    find "ok" c:\test.txt && echo success: 如果找到了"ok"字样,就显示"success",找不到就不显示

  3. || :顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令

    find "ok" c:\test.txt || echo fail: 如果找不到"ok"字样,就显示"fail",找到了就不显示

  4. | : 管道命令,前一个命令的执行结果输出到后一个命令
    dir *.* /s/a | find /c ".exe":先执行 dir 命令,对输出的结果执行后面的 find 命令

    综上,该命令的效果是:输出当前文件夹及所有子文件夹里的.exe文件的个数

    type c:\test.txt|more:这个和 more c:\test.txt 的效果是一样的

11.输入输出重定向

输出重定向:

  1. > 清除文件中原有的内容后再写入

  2. >> 追加内容到文件末尾,而不会清除原有的内容

输出重定向的作用是将内容输出到指定文件中,如果指定文件不存在则自动生成该文件

如果不进行输出重定向,则将内容输出到默认文件(即控制台上),例:

  1. echo hello world>c:\test.txt:生成c:\test.txt文件,内容为hello world

  2. type c:\test.txt >prn :屏幕上不显示文件内容,转向输出到打印机

  3. echo hello world>con :在屏幕上显示hello world,实际上所有输出都是默认 >con 的

  4. copy c:\test.txt d: >nul:拷贝文件到D盘,并且不显示"文件复制成功"的提示信息

  5. copy c:\test.txt d: >nul 2>nul:不显示"文件复制成功"的提示信息,并且即便命令出错,也不显示错误提示信息

  6. echo ^^W ^> ^W>c:\test.txt:生成的文件内容为 ^W > W ,^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^,类似于转义字符。

    即:^+一个字符即输出这个字符本身

注:

  • 0表示标准输入(键盘)
  • 1表示标准输出(con,即控制台)
  • 2 表示错误输出

输入重定向:< 从文件中获得输入信息
一般用于 date time label 等需要等待输入的命令

12.变量

变量名的访问:在变量名前后加 % ,即 %变量名% 来获取变量的值

命令描述
set显示目前所有可用的变量,包括系统变量和自定义的变量
echo %SystemDrive%显示系统盘的盘符(一般是C:)。
set p显示所有以p开头的变量,要是一个也没有则errorlevel=1
set p=aa1bb1aa2bb2设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
echo %p%显示变量p代表的字符串,即aa1bb1aa2bb2
set /a p=39设置p为数值型变量,值为39

注1:set 所设置的变量在控制台关闭后就丢失了

注2:赋值时,变量和= 之间不要有空格

echo %p:~x,y% 表示对变量的截取,从第x位开始显示连续y个字符

命令解释
echo %p:~6%显示变量p中第6个字符以后的所有字符,即aa2bb2
echo %p:~6,3%显示第6个字符以后的3个字符,即aa2
echo %p:~0,3%显示前3个字符,即aa1
echo %p:~-2%显示最后面的2个字符,即b2
echo %p:~0,-2%显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
echo %p:aa=c%用c替换变量p中所有的aa,即显示c1bb1c2bb2
echo %p:aa=%将变量p中的所有aa字符串置换为空,即显示1bb12bb2
echo %p:*bb=c%第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
  • 9
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值