批处理用过的命令及遇到的问题

注意:

遇到命令不熟悉,可以通过 cmd 命令行中使用 命令 /? 来查看具体命令的帮助

1. 注释

1
2
rem 需要提供一个文件  # rem 开头表示改行是注释行
echo Hello

2. 打印

关于回显

批处理中默认是开回显的,即命令本身和命令的执行结果都会打印

1
2
3
4
5
6
7
8
9
例如我们的脚本 test.bat文件如下
echo 123

执行:
C:\Codes\work>test.bat
执行结果:
C:\Codes\work>echo 123
123
会将命令本身和命令的执行结果都打印在命令行中

所以如果我们仅希望打印出命令的执行结果,不需要命令本身,则可以通过关闭回显,来完成。

echo [on/off], on 打开命令的回显状态;off 关闭命令的回显状态。

echo 前面加@与否。 作用:加**@代表不显示当前行命令自身**;否则反之。

1
2
3
4
5
6
7
8
9
10
11
12
13
echo off
echo 123
@echo off
echo 456

执行:
C:\Codes\work>test.bat
执行结果:
C:\Codes\work>echo off
123
456

从上面结果可得,``@echo off` 这句命令本身没有显示

所以通常批处理脚本中习惯在脚本的一开始关掉回显,即是用 @echo off

3. for循环

可以在 cmd命令行中查看帮助

1
for /?
1
2
3
4
5
6
7
FOR %variable IN (set) DO command [command-parameters]

注意,批处理中,指定变量请使用 %%variable
例如:
for /F %%i in (我的文件) do (
cmd
)

4. 程序返回值

ERRORLEVEL / errorlevel 大小写不敏感 与 shell 中的 $? 效果一样

0 表示”成功”、1 表示”失败”,实际上,errorlevel 返回值可以在0~255 之间。

返回值表示 参考这里

一般在脚本中使用 %ERRORLEVEL% 这个变量来获取上一条命令的返回值,

1
2
3
4
5
cmd1
if %ERRORLEVEL% == 1 {
cmd2
}
表示 cmd1 执行错误则执行 cmd2

注意

for循环中或if语句中多条命令都需要获取返回值等情况下,用errorlevel显得无效,第二条命令开始errorlevel的值都不会变。此处涉及批处理中的变量延迟问题,并不是errorlevel无效,而是对errorlevel变量的引用采用的是没开启变量延迟情况下的百分号%。

解决方法:

开启变量延迟的设置:setlocal EnableDelayedExpansion 同时使用 !errorlevel!变量,注意此时不能使用 %ERRORLEVEL%变量

1
2
3
4
5
setlocal enabledelayedexpansion
cmd1
if !ERRORLEVEL! == 1 {
cmd2
}

参考这篇博客_

5. 读取文件

读取一个文件

1
type 文件路径

在 for循环中读文件内容

1
2
3
4
5
for /F %%i in (我的文件) do (
cmd
)

这里可以通过 for /? 命令获取使用方式

6. 仅执行命令不打印运行结果

1
cmd > NUL

7. 使用 Ping 命令查看通联性

1
2
3
4
5
6
ping /?  查看ping 参数的使用

ping -n 2 -w 60 IP地址 // 发送2个包,设置 60s 超时
ping -n 2 -w 60 %%i | findstr "TTL" // 有结果的会有 TTL 这个关键内容

上面两条命令都可以

给一个之前的小脚本作为修改的参考
脚本20211130_ping_ip.bat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@echo off
rem ping测试,需要一个ip.txt的附件提供ip列表
setlocal enabledelayedexpansion
rem 下面用 %1 表示在命令行中接收第一个参数
rem for /F %%i in (%1) do (
for /F %%i in (C:\Users\test\Desktop\ip.txt) do (
rem echo %%i
rem echo ping -n 2 -w 60 %%i
rem echo %ERRORLEVEL%

ping -n 2 -w 60 %%i | findstr "TTL" > nul
rem ping -n 2 -w 60 %%i >nul
rem echo !ERRORLEVEL!
if !ERRORLEVEL! == 0 (
echo !ERRORLEVEL!
echo %%i reachable
echo %%i >> reachable_ip.txt
) else (
echo !ERRORLEVEL!
echo %%i unreachable
echo %%i >> unreachable_ip.txt
)
)
pause

TODO

  1. 遇到的还没解决的问题

    脚本20211130_ping_ip.bat,for循环执行指定文件,通过双击执行没有问题,但是如果使用命令行+传入参数的情况,脚本命令返回值的结果不对,为什么?

    1
    2
    3
    4
    5
    不管执行什么命令会返回下面两个返回值,通过查看返回值结果可知是命令没有正确执行导致的
    -1073741510
    或者
    9009
    后面找机会在测试看看
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2022-2023 ligongzhao
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信