持续更新中…
文章目录
前言
批处理学习,详细内容
一、输出、输入?
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
注意:=号后不要有空格!!! 否则连同空格一起赋值给了变量,这很容易被忽视。尤其是在频繁赋值和变量比较的时候,很容易出错。