批处理自学

本文详细介绍了批处理中的输出、输入操作,如con、copycon、typecon及nul的用法,并探讨了如何读取文件第一行。此外,还讲解了if-else条件判断的注意事项,以及在处理包含小数的文件内容时的挑战和解决方案,包括启用延迟环境变量扩展、避免小数操作等。最后,通过实例展示了如何在批处理中找到文件内容的最大最小值并进行边界调整。
摘要由CSDN通过智能技术生成

持续更新中…


前言

批处理学习,详细内容

一、输出、输入?

con:

con 代表计算机屏幕

copy con *

>copy con 1.txt/1.bat

说明:回车后, 所有屏幕内容将原封不动地输入到1.txt/1.bat中,直到输入Ctrl + z + 回车Ctrl + c。 此时会显示"已复制 1个文件。"。这相当于连续使用echo * >> 1.txt/1.bat。当1.txt/1.bat已经存在时,会提示是否覆。

type con

>type con

说明:回车后,屏幕内容(键盘输入)+回车,会显示屏幕内容。直到输入Ctrl + z + 回车Ctrl + c

总结

con 视为文本,只不过其内容是接下来屏幕上出现的内空(出现的内容目前只知道由键盘输入)。对其操作结束时,需要特殊的按键组合(如:Ctrl + z + 回车、Ctrl + c)。

nul:

1>nul 或 >nul

不显示操作成功信息,举例:

>pause >nul
>copy 地址1 地址2 >nul
>move 地址1 地址2 >nul

2>nul

不显示操作失败信息,举例(qwert.txt不存在):

>del qwert.txt 2>nul

>nul 2>nul

同时用,则无论成功失败都不显示

读取文件第一行:

set /p temp=< filename
注意: temp与=<之间不能有空格,不然无法识别filename

二、if-else相关注意

)else ()
注意:else与后面的 “(” 之间要有空格,不然出错

三、~

文件

以下在终端操作

rem 显示所有bat文件的路径:
for %a in (*.bat) do @echo %a %~dpa

rem 显示所有bat文件的名称:
for %a in (*.bat) do @cho %a %~na

rem 显示所有bat文件的扩展名:
for %a in (*.bat) do @echo %a %~xa

rem 显示所有bat文件的全称:
for %a in (*.bat) do @cho %a %~fa

四、其它

1、形如:123.456 54.321(abc.txt)文件内容的识别与找最大最小值

for /f "delims=^" %%a in (abc.txt) do (
	for /f "tokens=1-2 delims= " %%i in ("%%a") do (
		echo %%i %%j
	)
)

注意:^与后边的引号之间不能有空格,否则读不出第二列的54.321。也可以用delims=代替delims=^,同样不能有空格。
以上步骤后,123.456 54.321分别存储在 i,j
接下来,假如abc.txt中存的是经维度,且现在要确定坐标范围,即最大最小值

注意1:启用延迟环境变量扩展

setlocal enabledelayedexpansion,即启用延迟环境变量扩展。否则比较变量不更新。
endlocal 结束

注意2:批处理不能操作小数

若对:

%%i %%j

直接比较大小,结果很可能不是自己想要的,原因有二:
1、此时二者为“字符逐个”比较,9.2 > 10.1,因为:‘.’>‘0’
2、“123.456”赋值给可求值的数字变量时,出错:

>set /a x="123.456"

会显示:“运算符不存在。”
观察x的值会发现:

>set x
x=123

注意3:小数点后,形如"089"的“数”的操作

若:

>set /a x="089"

会提示:

>set /a x="089"
无效数字。数字常数只能是十进制(17),十六位进制(0x11)或
八进制(021)

注意4:变量的删除

为了简洁,以下代码没有显示

>set x=

读者应该自行加上!

最终解决方案:小数点前后分别比较

setlocal enabledelayedexpansion
for /f "delims=^" %%a in (abc.txt) do (
    for /f "tokens=1-4 delims=. " %%i in ("%%a") do (
    	::第一列的值(经度或维度)
        if %%i gtr !max1! (
            set /a max1=%%i
            set max12=%%j
        ) else (
            if %%i equ !max1! (
                if "%%j" gtr "!max12!" (
                    set max12=%%j
                )
            )
        )
        if %%i lss !min1! (
            set /a min1=%%i
            set min12=%%j
        ) else (
            if %%i equ !min1! (
                if "%%j" lss "!min12!" (
                    set min12=%%j
                )
            )
        )
        ::第二列的值(维度或经度)
        if %%k gtr !max2! (
            set /a max2=%%k
            set max22=%%l
        ) else (
            if %%k equ !max2! (
                if "%%l" gtr "!max22!" (
                    set max22=%%l
                )
            )
        )
        if %%k lss !min2! (
            set /a min2=%%k
            set min22=%%l
        ) else (
            if %%k equ !min2! (
                if "%%l" lss "!min22!" (
                    set min22=%%l
                )
            )
        )
    )
)
echo !min1!.!min12! ::最小值(经度或维度)
echo !max1!.!max12! ::最大值(经度或维度)
echo !min2!.!min22! ::最小值(维度或经度)
echo !max2!.!max22! ::最大值(维度或经度)
endlocal

此时就得到了最大值和最小值。注意:max1、min1、max2、min2为可求值的数字变量;max12、min12、max22、min22为普通变量。

思考:gmt画图时,绘图边界要比最大、最小值稍大、小一些,怎么实现?

rem 假如:上下限±0.5°
set /a nu2=!max12:~0,1!
set /a nu2=nu2+5
if !nu2! gtr 9 (
    set /a max1=max1+1
    set /a nu2=nu2-10
)
set max12=!nu2!!max12:~1!

set /a nu2=!min12:~0,1!
set /a nu2=nu2-5
if !nu2! lss 0 (
    set /a min1=min1-1
    set /a nu2=nu2+10
)
set min12=!nu2!!min12:~1!

set /a nu2=!max22:~0,1!
set /a nu2=nu2+5
if !nu2! gtr 9 (
    set /a max2=max2+1
    set /a nu2=nu2-10
)
set max22=!nu2!!max22:~1!

set /a nu2=!min22:~0,1!
set /a nu2=nu2-5
if !nu2! lss 0 (
    set /a min2=min2-1
    set /a nu2=nu2+10
)
set min22=!nu2!!min22:~1!

set min1=!min1!.!min12!
set max1=!max1!.!max12!
set min2=!min2!.!min22!
set max2=!max2!.!max22!

rem 在gmt中可直接使用:
**** -R!min1!/!max1!/!min2!/!max2!

以上实现了扩展

2、set赋值

set temp=%%p
set a=b

注意:=号后不要有空格!!! 否则连同空格一起赋值给了变量,这很容易被忽视。尤其是在频繁赋值和变量比较的时候,很容易出错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张立宝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值