打开windows批处理大门

Posted xiezhr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了打开windows批处理大门相关的知识,希望对你有一定的参考价值。

大家好,我是xiezhr。

1 前言

打开历史文章一看,上一篇文章是2021年3月20号更新的,又拖更了。

一个原因是,最近工作上真的挺忙的,有比较着急需要加班加点赶的需求。好在清明前算是把比较着急的改好了。本来安排清明也是要加班的,但是真的加不动了。(连着加班真的挺影响效率的,适当休息是非常有必要的~)

以至于一周都是在连轴转,需求改好更新之后也是心惊胆战的,生怕哪个地方出现问题,大脑一度都处于紧绷状态。

其次呢写一篇公众号文章还是挺费时费力的,又不想草率的更新一篇上去,这样还不如不写。

2 批处理简介

  • 批处理(Batch),也称为批处理脚本,扩展名为.bat或者.cmd。
  • 类似于linux或Unix中的shell脚本。
  • 包含一系列 DOS命令,通常用于自动执行重复性任务。只需我们双击批处理文件便可执行任务,而无需重复输入相同指令。
  • 批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效,熟练使用可以简化很多重复工作,提高工作效率。

3 批处理文件创建

  • 用记事本或者各种文本编辑器创建一个后缀为.bat的文件即可

  • 一般情况下每行一条命令,方便阅读方便书写。当然也可以用(&、&&、|、||)分割书写到一行,但不建议这样

  • 当像遇到像编程语言那样if、for 等命令时候,系统会扫描整个批处理,然后从第一行开始顺序向下逐句执行,直到程序结尾或者遇到exit或意外退出

废话不多说,直接上一个例子,感受下批处理的魅力 O(∩_∩)O哈哈~

下面是一个以批处理创建的计算器小例子,打开xiezhr.bat 后效果如下

4 批处理常用符号

4.1 @

回显屏蔽

① 语法

@ 

② 举例

rem 从本行开始关闭回显。一般批处理第一行都是这个
@echo off  

4.2 重定向1 >与>>

输出重定向命令 >清除文件中原有的内容后再写入 >>追加内容到文件末尾,而不会清除原有的内容。

主要将本来显示在屏幕上的内容输出到指定文件中,指定文件如果不存在,则自动生成该文件

① 语法

[p读取数据的位置] > [写入数据的位置]

[p读取数据的位置] >> [写入数据的位置]

② 举例

rem 将dir输出stdin重定向到文件Dirlist.txt,> 每次文件都会被重新创建,>> 则是文件追加
dir 1 > dirlist.txt
dir > dirlist.txt

dir 1>> dirlist.txt
dir >> dirlist.txt

rem 将打印信息重定向到文件,使用>每次文件会被重新创建,>> 则是文件追加
echo abc>log.txt
echo abc>>log.txt

rem 将所有的IP信息存入文件,使用>每次文件会被重新创建,>> 则是文件追加
ipconfig>log.txt
ipconfig>>log.txt

rem 阻止输出显示,将默认输出位置(句柄)重定向为nul 使用>每次文件会被重新创建,>> 则是文件追加
echo invalie prompt >nul
echo invalie prompt 1>>nul

4.3 重定向2 <

要从键盘或设备重定向命令输入

① 语法

[相应处理] < [读取数据的位置]

② 举例

rem 重定向输入是来自文件,并将输入的文件内容按首字母排序
sort<xiezhr.txt 

rem 将从stdin输入重定向为从文件输入,只输入文件首行内容,stdin(0)是默认输入,可以省略
set /p var=0<xiezhr.txt
set /p var=<xiezhr.txt
echo %var%

4.4 管道符号 |

传递作用,将前面一条命令的执行结果传递给后面一条命令继续执行

① 语法

[]|[]

② 举例

rem 将dir的输出作为sort的输入
dir | sort

rem 查找当前目录中包含".txt"的文件名
dir | find ".txt"

4.5 转义符 ^

用在特殊符号之前,取消特殊字符的作用

① 语法

^ [特殊字符]

② 举例

rem &将作为字符输出
echo 非常^&批处理 

4.6 逻辑命令符 &、&&、||

& 无论前面的命令是否成功执行 都执行后面的
&& 当前面的命令成功执行 再执行后面的命令 相当于逻辑与运算
|| 当前面的命令没有成功执行 则执行后面的命令 可以作判断选择用 相当于逻辑或运算

① 语法

[命令1]&[命令2]
[命令1]&&[命令2]
[命令1]||[命令2]

② 举例

rem & 
rem 虽然没有成功到“个人博客” 但还是会执行echo 命令,输出“字符中含有xiezhr”
echo xiezhrspace.cn | find "个人博客" & echo 字符中含有xiezhr


rem &&  
rem 没有成功到“个人博客” ,所以echo命令不会成功执行
echo xiezhrspace.cn | find "个人博客" && echo 字符中含有xiezhr

rem || 
rem 在xiezhrspace.cn中查找字符"个人博客",如果没有找到则继续执行后面的命令,即在屏幕中显示"字符中没有xiezhr",如果找到了,也就是如果前面是xiezhrspace.cn的话则停止继续执行||后面的命令,而是在屏幕中直接显示"xiezhrspace.cn".
echo xiezhrspace.cn | find "个人博客" || echo 字符中没有xiezhr
echo xiezhrspace.cn | find "xiezhr" || echo 字符中含有xiezhr

5 常用批处理

注意:在cmd中输入命令+/?即可查看该命令的帮助信息。如cd /?

5.1 文件夹管理

5.1.1 cd

显示当前目录名或改变当前目录

① 语法

cd   rem 显示当前路径
cd   rem 进入根目录
cd /d d:sdk   rem 变更盘符目录

② 举例

rem 进入根目录
C:\\Users\\xiezhr>cd
C:\\Users\\xiezhr

rem 显示当前目录
D:\\>cd
D:\\

rem 切换到F:\\xiezhrspace\\hexo-xiezhrblog 目录
C:\\Users\\ye.ff>cd F:\\xiezhrspace\\hexo-xiezhrblog
F:\\xiezhrspace\\hexo-xiezhrblog>

5.1.2 md

创建目录

①语法

MKDIR [drive:]path
MD [drive:]path

②举例

rem 在D盘下创建xiezhr目录
md d:xiezhr

5.1.3 rd

删除一个目录

①语法

rd [directoryname]

② 举例

rem 删除d盘xiezhr目录
rd d:xiezhr

5.1.4 dir

显示目录中的文件和子目录列表

① 语法

DIR [drive:][path][filename] 
        指定要列出的驱动器、目录和/或文件。

②举例

dir rem 显示当前目录中的文件和子目录
dir /a  rem 显示当前目录中的文件和子目录,包括隐藏文件和系统文件
dir c: /a:d rem 显示 C 盘当前目录中的目录
dir c: /a:-d rem 显示 C 盘根目录中的文件
dir c: /b/p rem /b只显示文件名,/p分页显示
dir *.exe /s rem 显示当前目录和子目录里所有的.exe文件

5.1.5 tree

以图形显示驱动器或路径的文件夹结构

① 语法

TREE [drive:][path] [/F] [/A]

   /F   显示每个文件夹中文件的名称。
   /A   使用 ASCII 字符,而不使用扩展字符。

② 举例

rem 显示D盘的文件目录结构
tree d: 

5.1.6 path

为可执行文件显示或设置一个搜索路径

① 语法

PATH [[drive:]path[;...][;%PATH%]
PATH ;

键入 PATH 但不加参数,显示当前路径。
将 %PATH% 包括在新的路径设置中会将旧路径附加到新设置

② 举例

::设置要永久加入到path环境变量中的路径
@echo off
set My_PATH=D:\\AppFolder
  
set PATH=%PATH%;%My_PATH%
reg add "HKLM\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment" /v "Path" /t REG_EXPAND_SZ /d "%PATH%" /f
exit

::设置要临时加入到path环境变量中的路径
@echo off
set My_PATH=D:\\AppFolder
set PATH=%PATH%;%My_PATH%
pause

5.1.7 xcopy

复制文件和目录树

① 语法

XCOPY source [destination][参数]

② 举例

rem 复制 d:xiezhr 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
rem 加 /i 表示如果 e: 没有 xiezhr 文件夹就自动新建一个,否则会有询问
xcopy d:xiezhr e:xiezhr /s/e/i/y

5.2 文件管理

5.2.1 type

显示文本文件的内容

① 语法

TYPE [drive:][path]filename

② 举例

rem 显示指定文件的内容(下面是显示d盘目录下xiezhr.txt文件的内容)
type d:xiezhr.txt

C:\\Users\\xiezhr>type d:xiezhr.txt
xiezhr的个人公众号:xiezhrspac

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

5.2.2 copy

将一份或多份文件复制到另一个位置

① 语法

COPY [source] [destination]

② 举例

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

rem 从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
rem con代表屏幕,prn代表打印机,nul代表空设备
copy con xiezhr.txt

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

rem 复制文件到自己,实际上是修改了文件日期
copy test.txt +

5.2.3 del

删除一个或数个文件

① 语法

del [filename]
 filename         指定一个或多个文件或者目录列表。
                通配符可用来删除多个文件。
                如果指定了一个目录,该目录中的所
                有文件都会被删除。

② 举例

rem 删除指定文件,不能是隐藏、系统、只读文件
del d:xiezhr.txt 

rem 删除 d:xiezhr 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
del /q/a/f d:xiezhr*.*

rem 删除 d:xiezhr 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
del /q/a/f/s d:xiezhr*.*

5.2.4 move

移动文件并重命名文件和目录

①语法

move [source] [destination]

② 举例

rem 将D盘xiezhr.txt 移动到f盘
move xiezhr.txt f:

rem 将xiezhr.txt重命名为xiezhrspace.txt
move xiezhr.txt xiezhrspace.txt

5.2.5 ren

重命名文件名

①语法

REN [drive:][path]filename1 filename2.

②举例

rem 将xiezhr文件夹重命名为xiezhrspace
ren d:xiezhr xiezhrspace

5.2.6 replace

替换文件

① 语法

REPLACE [drive1:][path1]filename [drive2:][path2] [/A] [/P] [/R] [/W]

 [drive1:][path1]filename 指定源文件。
 [drive2:][path2]         指定要替换文件的目录

②举例

rem 添加新文件到目标目录: 将 xiezhr.bat 文件添加到 E 盘目录下
replace /A C:\\xiezhr.bat E:\\ 

rem 提示替换文件到目标目录: 将 xiezhr.txt 文本文件替换到 temp 目录中去,( temp 目录必须有 xiezhr.txt 文本文件)
replace /P C:\\xiezhr.txt E:\\temp

5.2.7 attrib

显示或更改文件属性

① 语法

ATTRIB [+R | -R] [+A | -A ] [+S | -S] [+H | -H] [+I | -I]
       [drive:][path][filename] [/S [/D] [/L]]

  +   设置属性。
  -   清除属性。
  R   只读文件属性。
  A   存档文件属性。
  S   系统文件属性。
  H   隐藏文件属性。
  I   无内容索引文件属性。
  X   无清理文件属性。
  V   完整性属性。
  [drive:][path][filename]
      指定 attrib 要处理的文件。
  /S  处理当前文件夹
      及其所有子文件夹中的匹配文件。
  /D  也处理文件夹。
  /L  处理符号链接和
      符号链接目标的属性

② 举例

rem 查看d盘xiezhr目录下各个文件属性
D:\\xiezhr>attrib /s
A            D:\\xiezhr\\logo.png
A            D:\\xiezhr\\公众号-xiezhrspace.txt

rem 设置logo.png文件的属性为系统实现、隐藏属性、只读属性
D:\\xiezhr>attrib +s +h +r logo.png
D:\\xiezhr>attrib /s
A  SHR       D:\\xiezhr\\logo.png
A            D:\\xiezhr\\公众号-xiezhrspace.txt

rem 设置logo.png 恢复原来属性
D:\\xiezhr>attrib -s -h -r logo.png

D:\\xiezhr>attrib /s
A            D:\\xiezhr\\logo.png
A            D:\\xiezhr\\公众号-xiezhrspace.txt
rem 

5.2.7 find

① 语法

FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]

  /V         显示所有未包含指定字符串的行。
  /C         仅显示包含字符串的行数。
  /N         显示行号。
  /I         搜索字符串时忽略大小写。
  /OFF[LINE] 不要跳过具有脱机属性集的文件。
  "string" 指定要搜索的文本字符串。
  [drive:][path]filename
             指定要搜索的文件

② 举例

rem 在 d:/xiezhr/xiezhr.txt 文件里查找含 "公众号:xiezhrspace" 字符串的行如果找不到,将设 errorlevel 返回码为1
C:\\Users\\xiezhr>find "公众号:xiezhrspace" d:/xiezhr/xiezhr.txt

---------- D:/XIEZHR/XIEZHR.TXT
公众号:xiezhrspace

rem 查找含 xiezhrspace 的行,忽略大小写
C:\\Users\\xiezhr>find /i "xiezhrspace" d:/xiezhr/xiezhr.txt

---------- D:/XIEZHR/XIEZHR.TXT
博客:www.xiezhrspace.cn
公众号:xiezhrspace
更多实用的文章和资源尽在公众号:XiezhrSpace,欢迎订


rem 显示含 xiezhrspace 的行的行数
C:\\Users\\ye.ff>find /c "xiezhrspace" d:/xiezhr/xiezhr.txt

---------- D:/XIEZHR/XIEZHR.TXT: 2

5.2.8 fc

比较两个文件或两个文件集并显示它们之间的不同

① 语法

FC /B [drive1:][path1]filename1 [drive2:][path2]filename2
[drive1:][path1]filename1
             指定要比较的第一个文件或第一个文件集。
[drive2:][path2]filename2
             指定要比较的第二个文件或第二个文件集。

② 举例

rem 比较d盘xiezhr目录下的“公众号-xiezhrspace.txt” 和“xiezhr.txt”文件 。如下为比较结果
D:\\xiezhr>fc xiezhr.txt 公众号-xiezhrspace.txt
正在比较文件 xiezhr.txt 和 公众号-XIEZHRSPACE.TXT
***** xiezhr.txt


微信号:xie_zhr

博客:www.xiezhrspace.cn

公众号:xiezhrspace

***** 公众号-XIEZHRSPACE.TXT
公众号:xiezhrspace
*****

5.3 网络命令

5.3.1 ping

确定本地主机是否能与另一台主机交换数据报

① 语法

ping+IP地址或主机域名
ping+IP地址或主机域名+命令参数
ping+命令参数+IP地址或主机域名

② 举例

rem 本机与192.168.205.9是否连通
ping 192.168.205.9

rem 网络是否畅通
ping www.baidu.com

5.3.2 ftp

将文件传送到运行 FTP 服务器服务(经常称为后台程序)的计算机以及将文件从该计算机
传出。可以交互使用 Ftp。

① 语法

ftp -v -d -i -n -g [主机名] 
-v 显示远程服务器的所有响应信息;
-n 限制ftp的自动登录,即不使用;.n etrc文件;
-d 使用调试方式;
-g 取消全局文件名

② 举例

rem 将D盘xiezhr.txt文件上传到ftp 文件服务器
rem ftp服务器信息:ip:192.168.205.9 账号:xiezhr 密码:pswxiezhr

@Echo Off
Echo  open  192.168.205.9 > ftp .up
Echo xiezhr >> ftp .up
Echo pswxiezhr >> ftp .up
Echo Cd .\\User >> ftp .up
Echo binary>> ftp .up
Echo put  "D:xiezhr.txt" >> ftp .up
Echo bye>> ftp .up
FTP -s: ftp .up
del  ftp .up  /q
Pause

5.3.3 net

网络命令集及用户管理,根据使用的命令提供各种网络服务

① 语法

net [variant]  

② 举例

rem 查看计算机的当前密码和登录限制。
net accounts

添加或删除附加到Windows域控制器的计算机。
net computer

rem 显示当前的服务器或工作组设置。
net config

rem 该命令可以用于查看特定用户帐户的详细信息。
net user

rem 该命令用于停止和启动特定的服务。
net stop/start

rem 显示工作站或服务器的网络统计信息。
net statistics

rem 连接或断开计算机与共享资源或显示有关连接的信息
net use

5.3.4 telnet

查看某个端口是否可访问。我们在搞开发的时候,经常要用的端口就是 8080。那么你可以启动服务器,用telnet 去查看这个端口是否可用。

① 语法

telnet IP 端口
telnet 域名 端口

② 举例

rem 查看主机192.168.205.9 的8080端口是否可以访问
telnet 192.168.205.9 8080 

5.3.5 ipconfig

显示、修改TCP/IP设置

① 语法

ipconfig

② 举例

rem 查看本机IP地址
ipconfig 
无线局域网适配器 WLAN:
连接特定的 DNS 后缀 . . . . . . . :
IPv6 地址 . . . . . . . . . . . . : 2409:8a6c:72:41c0:5424:dc10:aa75:2782
临时 IPv6 地址. . . . . . . . . . : 2409:8a6c:72:41c0:1df7:d511:b10e:72c
本地链接 IPv6 地址. . . . . . . . : fe80::5424:dc10:aa75:2782%11
IPv4 地址 . . . . . . . . . . . . : 192.168.1.80
子网掩码  . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . : fe80::1%11
                                    192.168.1.1

5.3.5 msg

给用户发送消息

① 语法

MSG username | sessionname | sessionid | @filename | *
    [/SERVER:servername] [/TIME:seconds] [/V] [/W] [message]

  username            标识指定的用户名。
  sessionname         会话名。
  sessionid           会话 ID。
  @filename           识别这样一个文件,该文件含有将所发消息发送到的用户
                      名、会话名和会话标识号的列表。
  *                   给指定服务器上的所有会话发送信息。
  /SERVER:servername  要联系的服务器(默认值是当前值)。
  /TIME:seconds       等待接收器确认消息的时间延迟。
  /V                  显示有关执行的操作的信息。
  /W                  等待用户的响应,跟 /V 一起有用。
  message             要发送的消息。如果没有指定,发出提示,或者从 stdin
                      读取。

② 举例

  MSG /server:192.168.1.200 * "Hello"      ----------------->>>>>    运行成功,弹出消息对话框。

5.4 系统管理

5.4.1 shutdown

关闭计算机,或者注销当前用户

① 语法

Shutdown

②举例

rem 如果执行批处理文件的用户具有相关权限,则计算机将被关闭。					
@echo off 
shutdown

5.4.2 Tasklist

列出任务,包括任务名称和进程ID(PID)

① 语法

Tasklist

② 举例

rem 列出当前系统上的所有任务
@echo off 
Tasklist

5.4.3 Taskkill

于结束一个或多个任务。

① 语法

taskkill /im [taskname]

② 举例

rem 将发送一个终止消息到MS Paint的任何打开的程序
@echo off 
Taskkill /im mspaint.exe

5.4.4 reg

注册表是Windows系统的关键要素之一。 它包含有关操作系统各个方面的大量信息。 几乎所有安装在Windows系统上的应用程序都以某种形式与注册表交互
注册表包含两个基本元素:键和值

① 语法

rem 1 从注册表中检索任何键的值。
REG QUERY [ROOT\\]RegKey /v ValueName [/s] 
REG QUERY [ROOT\\]RegKey /ve --This returns the (default) value

rem 2 向注册表添加值,需要在系统上拥有足够的权限才能执行此操作
REG ADD [ROOT\\]RegKey /v ValueName [/t DataType] [/S Separator] [/d Data] [/f]
REG ADD [ROOT\\]RegKey /ve [/d Data] [/f]

rem 3 从注册表中删除值,需要在系统上拥有足够的权限来执行此操作。
REG DELETE [ROOT\\]RegKey /v ValueName [/f] 
REG DELETE [ROOT\\]RegKey /ve [/f] 
REG DELETE [ROOT\\]RegKey /va [/f]

rem 4 从注册表复制值,您需要在系统上拥有足够的权限才能在源位置和目标位置上执行此操作。
REG COPY [\\\\SourceMachine\\][ROOT\\]RegKey [\\\\DestMachine\\][ROOT\\]RegKey

rem 5 比较注册表项
REG COMPARE [ROOT\\]RegKey [ROOT\\]RegKey [/v ValueName] [Output] [/s]
REG COMPARE [ROOT\\]RegKey [ROOT\\]RegKey [/ve] [Output] [/s]

② 举例

rem 1 查询注册表项HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Windows\\ 下的所有键及其各自的值
@echo off R
EG QUERY HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Windows\\

rem 2 在注册表 - HKEY_CURRENT_USER\\Console 下添加一个键 键的名字是Test 分配给这个键的值是Test Data,它是默认的字符串类型
@echo off 
REG ADD HKEY_CURRENT_USER\\Console /v Xiezhr /d "xiezhr"  

rem 3 删除注册表HKEY_CURRENT_USER\\Console下的一个注册表项。 键的名称是Test
@echo off
REG DELETE HKEY_CURRENT_USER\\Console /v Xiezhr /f

rem 4  将内容从位置HKEY_CURRENT_USER\\Console复制到同一台机器上的HKEY_CURRENT_USER\\Console\\Xiezhr位置
@echo off 
REG COPY HKEY_CURRENT_USER\\Console HKEY_CURRENT_USER\\Console\\Xiezhr

rem 5 比较注册表项HKEY_CURRENT_USER\\Console & HKEY_CURRENT_USER\\Console\\Xiezhr之间的所有值
@echo off
REG COMPARE HKEY_CURRENT_USER\\Console HKEY_CURRENT_USER\\Console\\Xiezhr

6 Batch 常用命令

6.1 echo

打开回显或关闭请求回显功能,或显示消息。如果没有任何参数,echo命令将显示当前回显设置。
① 语法

echo [on|off] [message]

② 例子

rem 关闭单行回显
@  

rem 从下一行开始关闭回显
echo off  

rem 从本行开始关闭回显。一般批处理第一行都是这个
@echo off  

rem 从下一行开始打开回显
echo on 

rem 显示当前是 echo off 状态还是 echo on 状态
echo 

rem 输出一个”回车换行”,空白行
echo. 

rem 在实际应用中我们会把这条命令和重定向符号(也称为管道符号,一般用> >> ^)结合来实现输入一些命令到特定的文件中 命令会创建一个名为"test"的文本文件,并将"test"输入到文本文件中。
echo test>test.txt

6.2 rem 和 ::

注释命令,类似于在编程语言中的/--------/,它并不会被执行,只是起一个注释的作用,只有在编辑批处理时才会被看到,主要用于方便修改

① 语法

Rem [注释内容]

② 例子

Rem 此处是注释内容。

6.3 pause

暂停命令。运行 Pause 命令时,将显示下面的消息:
Press any key to continue. . .(或:请按任意键继续. . .)

① 语法

pause

② 例子

C:\\Users\\xiezhr>pause
请按任意键继续. . .

6.4 call

从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。还可以调用指定标号处后面的所有命令

① 语法

call [drive:][path]filename [batch-parameters]

[drive:][path]filename:指定被调用的批处理文件名,当被调用的批处理文件与正在执行的批处理文件处于同一目录下时,可以省调盘符及路径

②举例
在D盘先分别建立test.bat 和 called.bat批处理文件
test.bat

@echo off
echo 正在调用called.bat
call called.bat
echo called.bat 调用完毕

called.bat

@echo off
@echo 已经进入到called.bat 中。。。

test.bat 和called.bat 创建完毕后,执行test.bat,当test.bat执行到call called.bat命令时便转向执行called.bat批处理文件中的内容。called.bat 执行完之后继续执行test.bat call called.bat 命令行后面的内容

6.5 start

调用外部程序,所有的DOS命令和命令行程序都可以由start命令来调用

①语法

START “programname”              

② 举例

rem 修改 DOS 窗口标题
start title "新标题"

rem 打开计算机 E 盘
start E:

rem 最小化打开记事本
start /min notepad.exe

rem 最大化打开计算器
start /max calc

rem 打开任务管理器
start taskmgr

rem 同时打开写字板和计算器 用 & 将两个要开启的程序连起来
start write & calc

6.6 cls

清屏

① 语法

cls

② 举例

@echo off 
dir
cls

6.7 title

设置控制台窗口中显示的标题。在实际工作中,我们会在一台服务器上启动很多服务,这时我们通过给不同的服务起不同的名字就很容易辨认出不同服务

① 语法

TITLE [Tilename]
其中,tilename是要提供给命令提示符窗口标题的新名称

② 举例

rem 将把窗口的标题改为“xiezhr的新窗口“。
@echo off 
Title “xiezhr的新窗口”

6.8 ver

显示系统版本

① 语法

ver

② 举例

rem 下面命令将显示系统版本
@echo off 
ver

6.9 date

用于获取当前系统时间。

① 语法

date

② 举例

rem 显示当前日期
@echo off 
echo %DATE%

6.10 time

用于设置或显示时间

① 语法

time 

② 举例

rem 显示系统当前时间
@echo off 
echo %TIME%

6.11 exit

用于退出DOS控制台

① 语法

exit

② 举例

rem 退出doc控制台
exit

6.12 set

设置变量。引用变量可在变量名前后加 % ,即 %变量名%

① 语法

set

② 举例

rem 显示当前系统上的环境变量列表
@echo off 
set

rem 进行四则运算
@echo off
set /a a=1+1,b=2+1,c=3+1
echo %a% %b% %c%

6.13 if

判断语句,如果满足条件则执行条件后语句

① 语法

rem 1 if语句
if (condition) do_something

rem 2 if/else 语句
if (condition) (do_something) ELSE (do_something_else)

if 语句

if/else 语句

② 举例

rem  如果d盘存在xiezhr.bat 则输出“存在d:xiezhr.bat文件”
if exist d:xiezhr.bat echo 存在d:xiezhr.bat文件

rem 如果d盘不存在xiezhr 文件夹则输出“不存在d:xiezhr文件夹”
if not exist d:xiezhr (
echo 不存在d:xiezhr文件夹
)

rem 每个“if else”代码放在括号()中。 如果括号不是用于分隔"if"和"else"代码的代码,那么如果else语句不成立,那么这些语句就不会有效。
rem 在第一个“if else”语句中,if条件将评估为true。
rem 在第二个“if else”语句中,else条件将被执行,因为条件将被评估为false

@echo off 
SET /A a=15 
SET /A b=20
SET /A c=%a% + %b% 
if %c%==35 (echo "最后结果为 35") else (echo "为知结果") 
if %c%==45 (echo "最后结果为 45") else (echo "为知结果")

6.13 for

循环命令。对一组文件中的每一个文件执行某个特定命 具体参照 for /? 查看

① 语法

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

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

② 举例

rem 依次调用小括号里的每个字符串,执行 do 后面的命令
for %%i in (c: d: e: f:) do echo %%i

rem 把 d:xiezhr 及其子目录里的mp4文件的文件名都存到 d:xiezhr.txt 里去
for /r d:xiezhr %%i in (*.mp4) do echo %%i>>d:xiezhr.txt

rem 对当前目录里所有的txt文件执行 find 命令,找出包含“xiezhr” 字符的所有文件
for %%i in (*.txt) do find "xiezhr" %%i

rem 在当前目录和子目录里所有的.txt文件中搜索包含“xiezhr”字符串的行
for /r . %%i in (*.txt) do find "xiezhr" %%i

7 批处理使用中一些常见问题

7.1 双击打开批出里文件xiezhr.bat后闪退

可能原因

  • 执行速度很快,执行完之后,自行关闭
  • 语法错误

解决办法

  • 在最后面一行加上 pause
@echo off
set p=xiezhr
if %p%==xiezhr (
echo %p%
set p=xiezrhspace
echo %p%
)
pause

  • 用文本编辑器打开xiezhr.bat 文件,检查命令是否都书写正确

7.2 批处理xiezhr.bat 文件中输出中文乱码

原因

  • 记事本新建的文件,编码不是 utf-8

解决办法

  • 用【记事本】打开>【另存为】>【修改编码为:utf-8】

打开C++的大门

初识C++

1.C++的三大特性(背)

①封装

把客观的事务抽象成一个类(将数据和方法打包在一起,加以权限的区分,达到保护并安全使用数据的目的)

②继承

继承所表达的是类之间相关的关系,这种关系使得对象可以继承另外一类对象的特征和能力 -> 避免公用代码的重复开发,减少代码和数据冗余

③多态

多态性可以简单地概括为“一个接口,多种方法”,字面意思为多种形态。程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念

2.C与C++的区别

C面向过程:

核心:功能分解,自顶向下,逐层细化(程序=数据结构+算法)

C++面向对象:

在面向对象中,算法与数据结构被看做是一个整体,称作对象(对象=算法+数据结构)

3.C++命名空间

①:: 作用域运算符

#include<iostream>
int a=100;
int main()

    int a=10;
    std::cout<<"局部变量a="<<a<<std::endl;
    std::cout<<"全局变量a="<<::a<<std::endl;//这里::取全局变量
    std::cin.get();

②namespace解决命名冲突

a.命名空间只能全局范围内定义

b.命名空间可以嵌套命名空间

c.命名空间是开放的,可以随时把新的成员加入已有的命名空间中

d.命名空间中的函数,可以在命名空间外定义

e.无名命名空间,其命名空间的标识符只能在本文件访问

f.命名空间可以取别名

#include<iostream>
namespace A

    int a=100;
    void func(int n);

void A::func(int n)

    for(int i=0;i<n;i++)
        std::cout<<i<<' '<<std::endl;//命名空间中的函数,可以在命名空间外定义

namespace B

    int a=10;
    namespace C
    
        int a=1;//命名空间可以嵌套命名空间
    

namespace A

    int b=666;//命名空间是开放的,可以随时把新的成员加入已有的命名空间中

int main()

    namespace sp=A;//命名空间可以取别名
    std::cout<<"A中a="<<A::a<<std::endl;
    std::cout<<"A中b="<<A::b<<std::endl;
    std::cout<<"B中a="<<B::a<<std::endl;
    std::cout<<"B中C中a="<<B::C::a<<std::endl;
    A::func(10);
    std::cin.get();

③using使用命名空间

a.会先从命名空间中寻找变量、函数,找不到再从其他地方找

b.局部变量优先

#include<iostream>
namespace A

    int a=10;


//using namespace A; //全局使用整个命名空间
int main()

    int a=100;
//  using A::a;//using直接使用命名空间内的变量会与局部变量冲突

    using namespace A;
    std::cout<<a;//会优先使用局部变量
    
    std::cin.get();

4.C++中几个增强

①语法检查增强

a.变量不能重复定义

b.所有变量与函数必须要有类型

c.不同类型的变量不能直接赋值,需要相对应的强转

②结构体增强

a.结构体中可以定义成员函数

b.创建变量无需加struct关键字

#include<iostream>
struct test

    int a=10;
    void Output_num(void)//定义成员函数
    
        std::cout<<a<<std::endl;
    
; 
int main()

    test a;//无需struct
    a.Output_num();
    std::cin.get();

③新增bool类型

标准C++的bool类型有两种内建的常量true(转换为整数1)和false(转换为整数0)表示状态,它们都为关键字。bool类型只有两个值,占1个字节大小。给bool类型赋值时,非0值会自动转换为true(1),0值会自动转换为false(0)

④三目运算符功能增强

C++中三目运算表达式返回值为变量本身的引用,可以赋值

5.C/C++中的const

C语言中(默认为外部链接)

①const修饰全局变量,变量名只读,内存空间在文字常量区(只读),因此不能通过地址来修改空间内容

②const修饰局部变量,变量名只读,内存空间在栈区(可读可写),可以通过地址间接的修改空间内容

C++中(默认为内部链接)

①对于基础类型,用const修饰编译器会把它放入符号表中

②对其取地址,系统才会给data开辟空间

③若用变量名对const修饰的变量赋初值,系统会为其直接开辟空间

④对于自定义数据类型(结构体、对象等),用const修饰系统会给其开辟空间

⑤若要转换为外部链接,要在定义处加上extern

#include<iostream>
int main()

    const int data = 10;//放入符号表
    std::cout << "data = " << data << std::endl;
    int *p = (int *) &data;//取地址系统才会给其开辟空间
    *p = 20;
    std::cout << "*p = " << *p << std::endl;
    std::cout << "data = " << data << std::endl;//原先的值并不会改变
    
    int b = 100;
    const int a = b;//此时a不会放入符号表中,系统会直接为其开辟空间
    std::cout << "a = " << a << std::endl;
    p = (int *)&a;
    *p = 200;
    std::cout << "*p = " << *p << std::endl;
    std::cout << "a = " << a << std::endl;//原先的值也会跟着一起改变
    
    std::cin.get();

⭐️尽量用const替换#define

①const有类型,可进行编译器类型安全检查。#define无类型,不可进行类型检查

②const有作用域,而#define不重视作用域,默认定义处到文件结尾。如果定义在指定作用域下有效的常量,那么#define就不能用

③宏不能作为命名空间的成员,const可以

6.引用(给变量取别名)

引用必须初始化且一旦初始化就不能再修改别名

①作用于数组

#include<iostream>
int main()

    //法1
    int arr[5]=1,2,3,4,5;
    int (&my_arr)[5]=arr;//[]优先级高于& 若不加括号则先与[]结合 b为一个数组里面的元素均为引用
    for(int i=0;i<5;i++)
        std::cout<<my_arr[i]<<' ';
    
    //法2
    typedef int TYPE_ARR[5];//TYPE_ARR就是一个数组类型(有5个元素,每个元素为int)
    TYPE_ARR &myArr=arr;//TYPE_ARR=int [5]
    for(int i=0;i<5;i++)
        std::cout<<myArr[i]<<' ';
    std::cin.get();

②作为函数参数

#include<iostream>
void Swap(int &a,int &b)

    int tmp=a;
    a=b;
    b=tmp;

int main()

    int x=5,y=10;
    std::cout<<x<<' '<<y<<std::endl;
    Swap(x,y);//直接传值即可
    std::cout<<x<<' '<<y<<std::endl;
    std::cin.get();

③作为函数返回值

a.函数返回值为引用时,不要返回局部变量

b.当函数返回值作为左值,函数的返回值类型必须是引用(多用于运算符重载)

#include<iostream>
int& My_data(void)

    static int num=200;
    std::cout<<"num = "<<num<<std::endl;
    return num;//函数返回什么变量,引用就是该变量的别名

int main()

    int &ret=My_data();
    std::cout<<"ret = "<<ret<<std::endl;
    My_data()=2000;//函数返回值作为左值
    My_data();
    std::cin.get();

④引用的本质

引用在C++内部是一个指针常量,Type& ref=val == Type* const ref = &val;

⑤指针的引用

#include<iostream>
#include<cstdlib>
#include<cstring>
void MyStr1(char **p_str) //p_str=&str 即 *p_str=str
//对*p_str操作就相当于对str操作
    *p_str=(char *) calloc(1,sizeof (char));
    strcpy(*p_str,"hello world");

void MyStr2(char* &my_str)//&my_str = str2  my_str为str2的一个别名 str2的定义为char* 又&my_str=str2 故形参定义为...

    my_str=(char *) calloc(1,sizeof(char));
    strcpy(my_str,"hello world");

int main()

    //任务:封装一个函数 从堆区给str申请一个空间 并赋值为“hello world”
    char *str1=nullptr;
    MyStr1(&str1);//在函数内部更改指针指向,要传地址进去
    std::cout<<"str1 = "<<str1<<std::endl;
    free(str1);
    char *str2=nullptr;
    MyStr2(str2);
    std::cout<<"str2 = "<<str2<<std::endl;
    free(str2);
    std::cin.get();

函数参数变成指针的引用,不用取得指针的地址

⑥常引用

引用传参不会开辟新的空间,常引用在降低开销的同时,也能防止被修改

#include<iostream>
typedef struct

    int num;
    char name[10];
STU;
void PrintStruct(const STU &tmp)//tmp即为常引用
//这里只有读取操作,故用const修饰,防止被修改
    std::cout<<"学号:"<<tmp.num<<" 姓名:"<<tmp.name<<std::endl;

int main()

    STU s1=2020135,"Ricky";
    PrintStruct(s1);
    std::cin.get();

常量的引用 应不能被修改 故要用const修饰

const int &num=10;

7. 内联函数(inline function)

保持预处理宏的效率又增加安全性,而且可以像一般成员函数那样可以在类里访问自如

内联函数为了继承宏函数的效率,没有函数调用时的开销。然后又可以像普通函数那样,可以进行参数、返回值类型的安全检查,又可以作为成员函数

是一个真正的函数,函数的替换发生在编译阶段

#include<iostream>
inline int My_mul(int x,int y)

    return x*y;

int main()

    std::cout<<My_mul(10+10,20+20)<<std::endl;
    std::cin.get();

⭐️在类内部定义的函数会自动成为内联函数,不需要加inline关键字

内联函数的条件(加inline仅仅是给编译器一个建议):

  • 不能存在任何形式的循环语句
  • 不能存在过多的条件判断语句
  • 函数体不能过于庞大
  • 不能对函数进行取址操作

8.默认(缺省)参数

声明函数原型时可为一个或多个参数指定默认的参数值,当函数调用的时候如果没有传递该参数值,编译器会自动用默认值替代

#include<iostream>
int Add(int x=10,int y=20)

    return x+y;

int main()

    std::cout<<Add(100,200)<<std::endl;
    std::cout<<Add(100)<<std::endl;
    std::cout<<Add()<<std::endl;
    std::cin.get();

注意

  • 函数的默认参数从左向右,如果一个参数设置了默认参数,那么这个参数之后的参数都必须设置默认参数

  • 如果函数声明和函数定义分开写,函数声明和函数定义不能同时设置默认参数,定义处的默认参数时无效的

    建议在函数声明处设置默认参数

9.占位参数

占位参数只有参数类型声明,而没有参数名声明

调用函数时必须给占位参数传参,但不能再函数内使用

10.函数重载(多态的特性)

定义:

同一个函数名在不同场景下可以具有不同的含义

意义:

方便的使用函数名

条件

同一个作用域 参数个数不同 参数类型不同 参数顺序不同

注意

  • 函数的返回值类型不能作为函数重载的依据
  • 函数重载和默认参数一起使用,需要额外注意二义性问题
#include<iostream>
int Add(int x,int y=20)

    std::cout<<"int int的Add"<<std::endl;

int Add(int x)

    std::cout<<"int的Add"<<std::endl;

int main()

    Add(10);//产生二义性,两个Add都能识别
    std::cin.get();

11.C++和C混合编程

fun.h

#ifndef FUN_H
#define FUN_H
#if __cplusplus
extern "C"
#endif
    int Add(int x,int y);
    int Sub(int x,int y);
#if __cplusplus
;
#endif
#endif //FUN_H

fun.c

#include<stdio.h>
int Add(int x,int y)

    return x+y;

int Sub(int x,int y)

    return x-y;

main.cpp

#include<iostream>
#include"fun.h"
int main()

    std::cout<<Add(100,200)<<std::endl;
    std::cout<<Sub(100,200)<<std::endl;
    std::cin.get();

以上是关于打开windows批处理大门的主要内容,如果未能解决你的问题,请参考以下文章

Python--打开Python大门

云身份过于宽松,为攻击者打开了大门

还不会ts?一文带你打开ts的大门

还不会ts?一文带你打开ts的大门

还不会ts?一文带你打开ts的大门

C++打开C++的大门