最全面的window dos/bat 常用命令

window dos/bat 常用命令

    • 所有示例代码的编码格式为GBK或ANSI编码
    • 管道符和重定向符
      • 1、管道符
      • 2、 重定向符>【0表示标准输入,1表示标准输出,2标准错误】
    • 转义特殊字符
    • 系统默认的系统变量
    • if...else逻辑判断分支语句
      • 猜数字小游戏
    • for循环控制语句
      • for高级用法
      • 使用IF ... GOTO ...实现doWhile或退出循环
    • 字符串截取、查找、替换
    • 网络相关
      • 1、 查看本机内网ip
      • 2、 查看本机外网ip
      • 3、 netstat查看网络状态
      • 4、 telnet与服务器通信
    • 查看系统信息
      • 以管理员身份运行:直接复制即可
      • 生活案例:查看系统信息小工具
    • 文件相关
      • 生活案例一:桌面移动文件
      • 生活案例二:文件按规则批量重命名
    • 随机数
      • cmd命令的随机数取值范围
      • 生成0-100以内的随机数
      • 生成n-m之内的随机数
    • 等待n秒执行
    • start 命令
    • call 命令
      • 从批处理程序调用另一个批处理程序
      • 定义方法并调用
      • 使用goto 快速跳转到书签
    • 其它

所有示例代码的编码格式为GBK或ANSI编码

ANSI 美国国家标准学会,融合了全世界所有编码,在微软在叫做ANSI编码,使用page code 定位国家编码
查看国家page code 直接在cmd 窗口中键入chcp
更改cmd窗口的page code 使用 命令 chcp 国家码

管道符和重定向符

1、管道符

@echo off 
rem rem 表示注释
rem 管道符 将左边命令的结果作为参数传递给右边
rem 查找D盘myFile文件夹及其子文件夹下的所有txt文件
dir d:\myFile /s /b | findstr "\.txt"
rem 查找D盘myFile文件夹及其子文件夹下的所有txt文件,并将结果保存到d:\myFile\1.txt文件中
dir d:\myFile /s /b | findstr "\.txt" > d:\myFile\1.txt
pause

2、 重定向符>【0表示标准输入,1表示标准输出,2标准错误】

> 表示 覆盖文件内容,将左边写入右边
>> 覆盖文件内容,表示追加 

< 覆盖文件内容,将写右边入左边
<< 追加 ,将写右边入左边

对于 Windows NT 4 及其以后的版本,您需要使用ˆ转义第一个管道符和第一个重定向符 :
echo dir ˆ| findstr /R /I /C:" 0 Dir(s)" ˆ> null >> temporary.bat
重定向
command > file 将命令的标准输出的结果写入文件中
command 1>file 同上
command 2>file 将命令的标准错误的结果写入文件中
command > file 2>&1 将命令的标准输出和标准错误的结果写入文件中
command >> file 将命令的标准输出的结果追加写入文件中
command 1 >> file 同上
command 2 >>file 将命令的标准错误的结果追加写入文件中
command >> file 2>&1 将命令的标准输出和标准错误的结果追加写入文件中
commandA | commandB 将左边命令A的标准输出结果作为参数传递给右边命令B
commandA 2>&1 | commandB 将左边命令A的标准输出和标准错误结果作为参数传递给右边命令B
command < file 从文件中获取标准输入内容
command > null 将命令结果丢弃,不显示在屏幕中【可以理解为写入黑洞中】

转义特殊字符

期望得到的字符 转义后字符 说明
% %% 在双引号字符串中可能并不是必需的
^ ^^ 在双引号字符串中可能并非必需,但也不会有坏处
& ^& 在双引号字符串中可能并非必需,但也不会有坏处
> ^> 在双引号字符串中可能并非必需,但也不会有坏处
< ^< 在双引号字符串中可能并非必需,但也不会有坏处
| ^| 在双引号或单引号字符串中可能非必需,但这不会有什么坏处
^’ 仅在 FOR /F "subject" (即括号之间), 除非usebackq被使用
` ^` 仅在 FOR /F "subject" (即括号之间), 除非使用 usebackq
, ^, 仅在 FOR/F "subject"(即括号之间)中需要,即使在双引号字符串中也一样
; ^; 仅在 FOR/F "subject"(即括号之间)中需要,即使在双引号字符串中也一样
= ^= 仅在 FOR/F "subject"(即括号之间)中需要,即使在双引号字符串中也一样
( ^( 仅在 FOR/F "subject"(即括号之间)中需要,即使在双引号字符串中也一样
) ^) 仅在 FOR/F "subject"(即括号之间)中需要,即使在双引号字符串中也一样
! ^^! 仅当延迟变量扩展处于活动状态时才需要
\ \\ 仅在FINDSTR的正则表达式模式中需要
[ \[ 仅在FINDSTR的正则表达式模式中需要
] \] 仅在FINDSTR的正则表达式模式中需要
" \" 仅在FINDSTR的正则表达式模式中需要
" “” 仅在FIND的正则表达式模式中需要
. \. 仅在FINDSTR的正则表达式模式中需要
* \* 仅在FINDSTR的正则表达式模式中需要
? \? 仅在FINDSTR的正则表达式模式中需要

系统默认的系统变量

变量名 说明
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 XP Professional将操作系统显示为Microsoft Windows NT
path 指定可执行文件的搜索路径的系统j环境变量
pathExt 系统变量,返回操作系统将其视为可执行文件的文件扩展名的列表。
processor_architecture 返回处理器芯片结构的系统变量。值:x86、IA64。
processor_identfier 返回处理器描述的系统变量。
processor_level 返回计算机处理器型号的系统变量。
processor_revision 返回处理器修订号的系统变量。
prompt 返回当前解释程序的命令提示设置的本地变量。由cmd.exe生成。
random 返回0到32767之间的随机十进制数的系统变量,由cmd.exe 程序生成。
systemdrive 返回包含 Windows根目录(例如,系统根目录)的驱动器的系统变量。
systemroot 返回Windows根目录位置的系统变量。
temp 或 tmp 系统和用户变量,返回当前登录的用户可以使用的应用
程序的默认临时目录。某些应用程序需要使用TEMP,
而其他应用程序需要使用TIP。
time 返回当前时间的系统变量。该变量与time/t命令使
用相同的格式,并由cmd.exe生成。有关详细信息,请参阅Time 命令。
userdomain 返回包含用户帐户的域的名称的本地变量。
username 返回当前登录用户名的本地变量。
userprofile 返回当前用户配置文件位置的本地变量。
windir 返回操作系统目录位置的系统变量。
字体目录 %WINDIR%\Fonts
帮助目录 %WINDIR%\help
输入法目录 %WINDIR%\ime
桌面/音乐/搜藏夹 %USERPROFILE%\桌面
%USERPROFILE%\音乐
%USERPROFILE%\搜藏夹 等
右键菜单“发送到“ %USERPROFILE%\SendTo
rem 文件后缀都为.bat
rem 关闭逐行输出
@echo off
rem 输出变量用%变量名%,变量名【若没有特殊说明】不区分大小写
rem 使用时间系统变量
echo "当前时间是:%date% %time%"
rem 使当前目录系统变量,特殊的扩展变量,输出时需要使用""
echo "脚本所在的目录 %~dp0"
rem %cd%表示的是运行该脚本所在的文件目录
rem 一般情况是脚本所在的目录,但是如果是第三方软件运行的,
rem 会显示第三方软件所在的文件夹,所以建议使用%~dp0来显示当前目录
echo "当前目录是 %cd%"
rem 其它的类似,这里就不再写了
rem 暂停不关闭窗口
pause

if…else逻辑判断分支语句

IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command

  NOT               不等于可以使用not,不存在也使用not

  ERRORLEVEL number 每一条指令运行后都会产生一个错误等级值,写入系统变量ERRORLEVEL 中,0为错误,其它为正确
                    如果最后运行的程序返回一个等于或大于
                    指定数字的退出代码,指定条件为 true。

  string1==string2  如果指定的文字字符串匹配,指定条件为 true。

  EXIST filename    如果指定的文件名存在,指定条件为 true。

  command           如果符合条件,指定要执行的命令。如果指定的
                    条件为 FALSE,命令后可跟 ELSE 命令,该命令将
                    在 ELSE 关键字之后执行该命令。

ELSE 子句必须出现在同一行上的 IF 之后。例如:

    IF EXIST filename. (
        del filename.
    ) ELSE (
        echo filename. missing.
    )

由于 del 命令需要用新的一行终止,因此以下子句不会有效:

IF EXIST filename. del filename. ELSE echo filename. missing

由于 ELSE 命令必须与 IF 命令的尾端在同一行上,以下子句也
不会有效:

    IF EXIST filename. del filename.
    ELSE echo filename. missing

如果都放在同一行上,以下子句有效:

    IF EXIST filename. (del filename.) ELSE echo filename. missing

如果命令扩展被启用,IF 会如下改变:

    IF [/I] string1 compare-op string2 command
    IF cmdExtversion number command
    IF defined variable command

其中, compare-op 可以是:

    EQU - 等于
    NEQ - 不等于
    LSS - 小于
    LEQ - 小于或等于
    GTR - 大于
    GEQ - 大于或等于

而 /I 开关(如果指定)说明要进行的字符串比较不分大小写。
/I 开关可以用于 IF 的 string1==string2 的形式上。这些
比较都是通用的;原因是,如果 string1 和 string2 都是
由数字组成的,字符串会被转换成数字,进行数字比较。

CMDEXTVERSION 条件的作用跟 ERRORLEVEL 的一样,除了它
是在跟与命令扩展有关联的内部版本号比较。第一个版本
是 1。每次对命令扩展有相当大的增强时,版本号会增加一个。
命令扩展被停用时,CMDEXTVERSION 条件不是真的。

如果已定义环境变量,DEFINED 条件的作用跟 EXIST 的一样,
除了它取得一个环境变量,返回的结果是 true。

如果没有名为 ERRORLEVEL 的环境变量,%ERRORLEVEL%
会扩充为 ERROLEVEL 当前数值的字符串表达式;否则,你会得到
其数值。运行程序后,以下语句说明 ERRORLEVEL 的用法:

    goto answer%ERRORLEVEL%
    :answer0
    echo Program had return code 0
    :answer1
    echo Program had return code 1

你也可以使用以上的数字比较:

    IF %ERRORLEVEL% LEQ 1 goto okay

如果没有名为 CMDCMDLINE 的环境变量,%CMDCMDLINE%
将在 CMD.EXE 进行任何处理前扩充为传递给 CMD.EXE 的原始
命令行;否则,你会得到其数值。

如果没有名为 CMDEXTVERSION 的环境变量,
%CMDEXTVERSION% 会扩充为 CMDEXTVERSION 当前数值的
字串符表达式;否则,你会得到其数值。

猜数字小游戏

rem & 表示多条命令放在同一行执行
@echo off & title 猜数字小游戏 
rem 开启扩展命令,用于计算、扩展变量之类的
setlocal enabledelayedexpansion
rem %random% 命令行默认系统变量,表示生成随机数
REM 产生[min,max]之间的随机数,公式:随机数%(max-min+1)+min
rem 命令行中的取模用两个百分号%%表示
set /a r=%random%%%100+1 
rem  格式 :变量【可以任意取名】,类似于定义方法
rem goto 表示回到锚点,可以理解为重新进入方法
:input
rem 声明变量
set ent=
rem /p 获取从键盘输入的值,赋值给变量ent【enter】
set /p "ent=请小姐姐输入(1~100之间的数):"
rem 打印输入的值
echo "%ent%" 
rem 做边界值判断
rem 如果输入的值小于0,重新进入方法
if %ent% leq 0 (goto :input)
rem 如果输入的值大于100,重新进入方法
if %ent% gtr 100 (goto :input)
rem 偷瞄一下生成的随机数
rem echo "随机数:!r!"
rem 输入值=随机数
if %ent% equ !r! (echo "真棒!大聪明,猜中了!奖励小红花一朵,游戏结束")
rem 输入值<随机数
if %ent% lss !r! (echo "小猪猪,猜错了!【小了】重新猜" & goto :input)
rem 输入值>随机数
if %ent% gtr !r! (echo "小猪猪,猜错了!【大了】重新猜" & goto :input)
pause

for循环控制语句

@echo off
rem rem 表示注释
echo "**************for 后面没有参数,只能搜索指定目录下的文件【不包含子目录】,指定多个目录用空格分开**********************"
for %%i in (D:\dir1\*.txt D:\dir1\dir2\*.txt) do echo %%i
echo "=======in (*)只有文件名,文件不包含路径,默认在当前目录下查找,*通配符表示一个或多个========="
for  %%i in (*) do echo %%i
echo "=======in (*.txt *.bat)只有文件名,文件不包含路径,多种文件格式用空格分开========="
for  %%i in (*.txt *.bat) do echo %%i

echo "**************for 后面有参数**********************"
REM for 有/F参数 但是【没有指定】usebackq 选项的写法:注意in后面不同形式符号的不同
REM FOR /F "其它options..." %variable IN (file-set) DO command [command-parameters]
REM FOR /F "其它options..." %variable IN ("strng") DO command [command-parameters]
REM FOR /F "其它options..." %variable IN ('command') DO command [command-parameters]

REM for 有/F参数并且指定了 usebackq 选项的写法:注意in后面不同形式符号的不同,加入usebackq的目的是防止目录或文件名称有空格
REM FOR /F "usebackq 空格后写其它options..." %variable IN ("file-set") DO command [command-parameters]
REM FOR /F "usebackq 空格后写其它options..." %variable IN ('string') DO command [command-parameters]
REM FOR /F "usebackq 空格后写其它options..." %variable IN (`command`) DO command [command-parameters]

REM in中可以使用命令行得到结果作为后续处理对象,但需要用反引号括起来`` 同时使用"usebackq"
REM 结果中的文件包含路径,【如果想要去掉路径】 将【%%i】改成【%%~ni】扩展
for /f "usebackq" %%i in (`dir /a-d /s /b *.txt`) do echo %%i
echo "=======555555========="
for /f "usebackq" %%i in (`dir /s /b`) do echo %%i
echo "--------------------"
for /f "usebackq" %%i in ("1.txt") do echo %%i
echo "**********以下直接用不用改,使用=分割,**************************"
FOR /f "usebackq tokens=1* delims==" %%i IN (`set`) DO @echo [%%i=%%j]

echo "*****************【写法一】:在命令行模式中使用到盘符需要用英文双引号括起来"D:\dir" 使用/a-d /s /b来搜索子目录*******************"
for /f "usebackq" %%i in (`dir "D:\dir1\*.txt" /a-d /s /b`) do echo %%i

rem 递归搜索指定目录下的指定类型的文件
echo "*************递归搜索指定目录下的指定类型的文件【包括子目录】,等同于【写法一】 ***********************"
for /r D:\dir1 %%i in (*.txt) do echo %%i

echo.
echo "格式:FOR /D %variable IN (set) DO command [command-parameters]"
echo "这个参数主要用于目录搜索,不会搜索文件,/D 参数只能显示当前目录下的目录名字。(特别说明:只会搜索指定目录下的目录,不会搜索再下一级的目录。)"
echo "==============显示c盘根目录下的所有目录 和d盘指定目录========================"
for /d %%i in (c:\* d:\dir1\*) do echo %%i 
echo "==============显示指定目录下名称只有1-4个字母的目录========================"
for /d %%i in (d:\dir1\????) do echo %%i 

echo.

echo "格式:FOR /L %variable IN (start,step,end) DO command [command-parameters]"
echo "该集表示以增量形式从开始到结束的一个数字序列。可以使用负的 Step"
rem 输出1 2 3 4 5
echo "==============输出1 2 3 4 5========================"  
for /L %%i in (1,1,5) do echo %%i 
rem 输出1,3,5,7,9
echo "==============输出1,3,5,7,9========================"
for /L %%i in (1,2,10) do echo %%i 
rem 输出100,80,60,40,20
echo "==============输出100,80,60,40,20========================"
for /L %%i in (100,-20,1) do echo %%i 
rem 打开5个CMD窗口,慎用,我先注释掉
rem for /L %%i in (1,1,5) do start cmd 
rem 建立从1~5共5个文件夹
echo "==============建立从1~5共5个文件夹========================"
for /L %%i in (1,1,5) do md %%i 
rem  等待2秒
timeout /t 2
rem 删除从1~5共5个文件夹
echo "=============删除从1~5共5个文件夹========================="
for /L %%i in (1,1,5) do rd /q %%i 

rem echo.或者echo=表示空行,.前面不要有空格,意思是 将echo. 和 pause 两条命令 放在一起执行
echo. & pause

for高级用法

rem 固定写法:关闭命令行回显并打开命令行扩展
@echo off & setlocal enableextensions
cd /d D:\myFile
echo "=============文件名不能有空格,有空格会被忽略,以下几种写法效果一致=========================="
for /f "usebackq"  %%i in (`dir /a-d /s /b ^|findstr "\.txt"`) do echo "%%i"
echo "===============在for /f 模式中 管道符|要使用^转义========================"
for /f  %%i in ('dir /a-d /s /b ^|findstr "\.txt"') do echo "%%i"
echo "======================================="
for /f  %%i in ('dir /a-d /s /b ^|findstr ".*\.txt$"') do echo "%%i"
echo "======================================="
for /f  %%i in ('dir /a-d /s /b *.txt') do echo "%%i"
echo "======================================="
for /f "usebackq" %%i in (`dir "D:\myFile\*.txt" /a-d /s /b`) do echo "%%i"

echo.
echo "===========for /r 模式 in中只能写通配符和字符串,命令不生效============================"
echo "===========查找当前目录下的txt文件,文件名可以有空格,不会被忽略============================"
for /r %%i in (*.txt) do echo "%%i"
echo "===========查找指定目录下的txt文件,文件名可以有空格,不会被忽略============================"
for /r D:\myFile %%i in (*.txt) do echo "%%i"
pause

使用IF … GOTO …实现doWhile或退出循环

@echo off
for /L %%i in (1,1,5) do(
 if %%i eq 3
 goto three
)

:three
echo “进入到three”

字符串截取、查找、替换

@echo off
rem rem 表示注释
rem 字符串替换,格式【%变量名:oldStr=newStr%】
set aa=伟大的中国!我为你自豪!
rem 【方法一:直接用echo输出】
echo 替换前:%aa%
echo 替换后:%aa:中国=中华人民共和国%
rem 【方法二:用变量接收】
set "aa=%aa:中国=中华人民共和国%"
echo aa = %aa%

REM  字符串截取 格式【%变量名:~x,y% 】(x是下标,从0开始,y是截取个数)
rem 截取日期的前两个字符
echo %date:~0,2%

rem 字符串查找
rem |表示管道符,find或findstr表示查找字符串,
rem 管道符的作用是:将前一个命令的结果作为参数传递个下一条命令
echo "本机内网ip是"  
ipconfig | find "192.168"
echo "本机外网ip是" 
curl cip.cc | find "IP"
rem echo.或者echo=表示空行,.前面不要有空格,意思是 将echo. 和 pause 两条命令 放在一起执行
echo. & pause

网络相关

1、 查看本机内网ip

2、 查看本机外网ip

3、 netstat查看网络状态

4、 telnet与服务器通信

@echo off
rem rem 表示注释
rem 查看本机内网ip 
ipconfig
rem 查看本机外网ip 
curl cip.cc

rem 查看网络状态 
netstat -aon
rem 查找指定端口号 netstat -aon|findstr "端口号" 【第一步,会查到pid】
rem taskkill /pid xxx -f  【根据第一步得到的pid,结束进程】

rem telnet与服务器通信
rem 使用 telnet 连接到 在 telnet.microsoft.com
telnet telnet.microsoft.com 44
rem 进入telnet 后,如果要发送数据,使用sent
sent "要发送的字符串"

rem echo.或者echo=表示空行,.前面不要有空格,意思是 将echo. 和 pause 两条命令 放在一起执行
echo. & pause

查看系统信息

以管理员身份运行:直接复制即可

%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit

生活案例:查看系统信息小工具

@echo off
rem rem 表示注释
rem  以管理员身份运行
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
REM echo 当前盘符:%~d0
REM echo 当前盘符和路径:%~dp0
REM echo 当前批处理全路径:%~f0
REM echo 当前盘符和路径的短文件名格式:%~sdp0
REM echo 当前CMD默认目录:%cd%
REM echo 目录中有空格也可以加入""避免找不到路径
REM echo 当前盘符:"%~d0"
REM echo 当前盘符和路径:"%~dp0"
REM echo 当前批处理全路径:"%~f0"
REM echo 当前盘符和路径的短文件名格式:"%~sdp0"
REM echo 当前CMD默认目录:"%cd%"
echo "查看当前运行文件的内容,当前文件所在路径:%~f0"
type %~f0
echo "请认准阅读以上内容,按回车键后,会继续执行以上所写内容"
echo "关闭打开窗口会自动执行下一任务,如果遇到停顿请敲击回车..." &pause >null"
echo "正在清理指定目录垃圾文件:%temp%"
del /s /q %temp%
echo "清理完毕!"
echo "接下来的操作:查看系统信息"
msinfo32
echo "接下来的操作:查看电脑开机启动项"
msconfig
echo "接下来的操作:查看电脑任务管理管理器"
taskmgr
echo "接下来的操作:查看电脑正在运行的程序"
tasklist
echo "接下来的操作:磁盘垃圾清理:c盘"
cleanmgr /tuneup:1
rem 蓝绿色
color 1a
echo "接下来的操作:检查卷的文件系统和文件系统元数据是否存在逻辑和物理错误,如果有修复卷上的错误"
chkdsk /r /scan
rem 蓝黄色
color 1e
echo "接下来的操作:扫描所有受保护的系统文件的完整性,并尽可能修复出现问题的文件"
sfc /scannow
pause

文件相关

@echo off
rem rem 表示注释
echo "=======当前文件路径是=========%cd%"
echo "输出到文件中"
echo "哈哈,我是小孩也是王" > 1.txt
echo "查看文件,使用type"
type 1.txt
rem 列出文件层级目录及其文件,以图形显示目录结构
tree -f

rem 列出目录,显示目录中的文件和子目录列表
dir 
rem 列出当前目录及其子目录的所有文件
rem /a-d 表示排除目录,/s 搜索子目录下的文件 /b 显示全路径
dir /a-d /s /b
rem 列出当前目录及其子目录的特定文件
dir /a-d /s /b *.txt *.mp4
rem 搜索指定目录下的指定文件【这里搜索d盘】
dir d:\ /a-d /s /b *.txt *.mp4

rem 创建目录、文件 md/mkdir 
rem 创建目录,不存在会创建
mkdir .\a\b\c\d 
rem 创建文件,默认在当前文件夹下
echo haha > hello.txt
rem 这种形式 ,如果有目录不存在,会报错
rem echo haha > .\a\b\hello.txt

rem 显示当前目录名或改变【change】当前目录 cd/chdir
rem 直接键入cd 显示当前目录
cd 
rem cd 目录路径【不能改变驱动盘符】
rem 在c盘目录下,键入 cd d:\a 会没反应
rem cd /d 目录路径【可以改变驱动盘符】
cd /d d:\a

rem 删除目录、文件 del、rd/rmdir
rem /s 用于删除目录树 ,/q 安静模式,带 /S 删除目录树时不要求确认
rem rd /s /q 目录路径
rem del 删除一个或多个文件,/s 用于删除目录树 ,/q 安静模式,带 /S 删除目录树时不要求确认
rem del /s /q 目录路径

rem 移动目录、文件 move
rem 移动文件并重命名文件和目录,不能垮盘符移动,否则会出现拒绝访问
rem .\表示当前目录,..\表示上一级目录,移动当前目录下的目录到当前目录的dir2目录中
move .\a dir2
rem 如果目的地是文件名,则重命名
move 6_2.txt 66.txt
rem 如果目的地是文件夹,则移动
move 6_2.txt .\a
rem 复制目录、文件 copy  将一份或多份文件复制到另一个位置【不会复制目录】
rem 将当前目录下的a文件夹中的文件,复制到上一级目录中
copy .\a ..\

rem 复制大量文件 xcopy 复制文件和目录树
rem /s 复制目录和子目录,不包括空目录。
rem /j 复制时不使用缓冲的 I/O。推荐复制大文件时使用
xcopy 开始位置 目的位置 /s /j

rem echo.或者echo=表示空行,.前面不要有空格,意思是 将echo. 和 pause 两条命令 放在一起执行
echo. & pause

生活案例一:桌面移动文件

@echo off
echo "需求:生活场景:使用dos命令行,查找当前电脑桌面不是快捷方式的文件"
echo "并移动到D盘的myFile文件下【没有该文件夹自动创建】"
rem rem 表示注释, echo表示输出到控制台
rem 复制这段代码到记事本中,保存,修改文件后缀为.bat格式
echo "更改命令行窗口的颜色"
rem 更改命令行窗口的颜色
color 0e

echo "目标:移动到d:\myFile"

echo "判断是否有该文件夹"
IF not EXIST d:\myFile (
	mkdir d:\myFile
	echo "创建成功!"
) ELSE (
	echo "创建成功!"
)

rem 第一步目标:保存到1.txt文件中
echo "第一步目标:保存到1.txt文件中"
rem /a-d 表示排除文件夹,/s /b 表示查找所有子目录中的子文件
rem | 管道符 将左边命令的结果作为参数传递给右边
rem findstr 正则查找字符串,-v 查找不与指定字符串匹配的所有内容
rem ".*\.lnk$" 正则表达式 .任意目录, 
rem *.ink【.ink文件后缀的所有文件】 点号要转义写成\. $以ink结尾
dir /a-d /s /b | findstr -v  ".*\.lnk$" >1.txt
rem 查看1.txt文件的内容 
echo "查看1.txt文件的内容"
type 1.txt
rem 循环文件中的内容
echo "循环文件中的内容"
for /f "usebackq" %%i in ("1.txt") do  move %%i d:\myFile
echo author by LinJianhui
echo 报告,移动完成,等待5秒自动退出!
rem 等待5秒自动退出
timeout /t 5
exit

最全面的window dos/bat 常用命令_第1张图片

生活案例二:文件按规则批量重命名

@echo off
rem 复制这段代码到记事本中,保存,修改文件后缀为.bat格式
rem 更改命令行窗口的颜色
color 0e
set index=0
rem rem 表示注释 
rem 开启延迟扩展,不然index+=1不生效
setlocal EnableDelayedExpansion
rem 查找当前目录及其子目录中的视频文件,/a-d排除文件夹,
rem usebackq 防止文件名有空格 一定要配合in中的反引号,可以说是固定写法
for /f  "usebackq delims="  %%i in (`dir /a-d /b /s *.mp4 *.avi *.mov`) do (
rem set /A 表示执行算数运算
set /A index+=1
echo "========打印带全路径的文件名和扩展名"========"
echo %%i
echo "========打印【不带路径】的文件名和扩展名"========"
echo %%~nxi
rem 【方法一】!index!表示引用延迟扩变量,*.*会自动映射原文件名
rem ren %%i !index!_*.*
rem 【方法二】
ren %%i !index!_%%~nxi
)
echo author by LinJianhui
echo 报告,重命名完成!
rem 等待5秒自动退出
timeout /t 5
exit 

最全面的window dos/bat 常用命令_第2张图片

随机数

cmd命令的随机数取值范围

%RANDOM% 系统变量只能返回 0 到 32767 之间的任意十进制数字。2的15次方等于32768,上面的0~32767实际就是15位二进制数的范围。
因此,利用cmd命令,生成的最大随机数就是32767,最小随机数就是-32767。
但我们一般不会在学习阶段去测试生成负的随机数,因为学会如何生成正随机数了,负随机数在正随机数的基础上加一个负号就能解决啦。

生成0-100以内的随机数

那么,如何获取100以内的随机数呢?
很简单,将%RANDOM%按100进行求余运算即可,见例子。
例:生成5个100以内的随机数
批处理中求模得用两个%%符号。 
@echo off
  rem 开启扩展命令,用于计算、扩展变量之类的
  setlocal enabledelayedexpansion
  for /L %%i in (1 1 5) do (
     rem /a 表示开启计算模式
     set /a randomNum=!random!%%100
     rem !变量名!表示是引用的计算变量,应该能用%变量名%代替
     echo 随机数:!randomNum!
  )
  pause

生成n-m之内的随机数

求余数运算set /a randomNum=!random!%%100中的100可以是1~32768之间的任意整数。
总结:利用系统变量%random%,求余数运算%%,字符串处理等,可以实现很多随机处理。
通过上面的学习,我们知道,%random%可以产生0到32767之间的随机数,但是,如何才能得到一定范围内的随机数呢? 
我们可以使用通用的算法公式如下: 
通用的公式%random% %% (max-min+1)+min来产生[min,max]区间里的随机数,
注:批处理中求模得用两个%%符号。 
比如,我们想获得4到12之间的随机数,就可以这样来使用,代码如下:
REM 产生10个[4,12]间的随机数 
rem 若!变量名!没有效果,用%变量名%代替
@echo off 
REM 启用延迟环境变量扩展,使得变量%可以用!替代,如%random%与!random!效果一致
setlocal enabledelayedexpansion 
REM 设置随机数的最小和最大值以及求模用的变量 
set min=4 
set max=12 
set /a mod=!max!-!min!+1

for /l %%i in (1,1,10) do ( 
REM 产生[min,max]之间的随机数 
set /a r=!random! %% !mod!+!min! 
echo. 
echo 随机数%%i:!r!
)
pause

等待n秒执行

@echo off
rem rem 表示注释
rem 20秒后自动关闭
timeout /t 20 
rem 退出
exit

start 命令

@echo off
rem rem 表示注释
rem 快速打开记事本
start "标题"  "C:\Windows\System32\notepad.exe"
rem 启动后退出黑窗口
exit

call 命令

从批处理程序调用另一个批处理程序

@echo off
rem rem 表示注释
rem 从批处理程序调用另一个批处理程序
rem 调用stop.bat
call stop.bat
rem 启动后退出黑窗口
exit

定义方法并调用

@echo off
rem 调用方法,需要两exit才能退出黑窗口
call :sayHello 张三 街头小霸王
pause

rem 【注意:】这里要写在外面,pause之后,否则会被当做书签,再次被执行
rem 参数(如 %1 %2 %3 %4 %5 ...),%*表示所有参数
rem 定义sayHello 方法 ,参数会在调用是传入
:sayHello
echo "我的名字是%1"
echo "外号,人称:%2"

使用goto 快速跳转到书签

@echo off
rem 使用goto 会跳过后面的命令
rem 书签没有参数,注意与call调用区别
goto :sayHelloBookMark
echo "这里会被直接跳过,hello"
pause

:sayHelloBookMark
echo "这是我的小说"
echo "《霸道总裁辉哥爱上我》"
pause

其它

@echo off
rem rem 表示注释
echo "改变字体颜色"
color 0a
rem 查看指令帮助格式 【help 指令】,或者 【指令 /?】 如:
for /?
dir /?
rem 查看所有指令
help
rem 将指令结果写入文件【覆盖】使用 >,forHelp.txt不存在会自动创建
for /? > forHelp.txt
echo "我是小孩也是王" > hello.ext
rem 将指令结果写入文件【追加】使用 >>,forHelp.txt不存在会自动创建
rem echo.或者echo=表示空行,.前面不要有空格,意思是 将echo. 和 pause 两条命令 放在一起执行
echo. & pause
rem 去掉按任意键继续的提示使用 > nul
rem echo. & pause > nul

你可能感兴趣的:(windows,window,bat批处理编程,bat批处理编程,dos命令行)