运维必学 | 基础脚本示例-从零开始学Windows批处理(Batch)编程系列教程

2023-10-31 17:30:16 浏览数 (1)

本文为作者原创文章,为尊重作者劳动成果禁止非授权转载,若需转载请在【全栈工程师修炼指南】公众号留言,或者发送邮件到 [master@weiyigeek.top] 中我将及时回复。

此篇文章为作者在学习Batch批处理编程中,所编写或者收集整理的批处理示例,能极大的便于初学者作为入门学习的参照学习,从而快速入门到应用在工作实践中,这也是作者发布此篇文章的初心,希望针对大家有帮助,整理不易请点赞、在看与投币吧!

温馨提示: Windows Batch 批处理系列教程示例脚本可访问作者Github仓库中DevelopLearnig的项目,✈直达-> https://github.com/WeiyiGeek/DevelopLearnig/tree/main/TerminalScript/bat

0x00 数值运算示例

1.打印九九乘法表

描述: 在批处理中使用 SETLOCAL 和 set 与 FOR 命令,来展示使用批处理来打印四种样式的九九乘法表。

批处理示例

  • 方式1
代码语言:javascript复制
@ECHO OFF 
@REM 九九乘法表
@REM 使用变量延迟绑定扩展
SETLOCAL ENABLEDELAYEDEXPANSION

@REM 终端背景颜色设置
color 2F
echo 正向递增:
for /l %%i in (1,1,9) do ( 
for /l %%j in (1,1,%%i) do ( 
	set /a h=%%i*%%j 
@REM 此处值得学习借鉴
	set /p=%%i×%%j^=!h! <nul
	if %%i==%%j echo. 
	) 
) 

echo.
echo 正向递减:
for /l %%i in (9,-1,1) do ( 
for /l %%j in (1,1,%%i) do ( 
	set /a h=%%i*%%j 
	set /p=%%i×%%j^=!h! <nul 
	if %%i==%%j echo. 
	) 
) 

echo.
echo 反向递增:
for /l %%w in (1,1,9) do ( 
for /l %%k in (%%w,-1,1) do (
	set /a h=%%w*%%k
	set /p=%%w×%%k=!h! <nul 
	if /I %%k==1 echo.
	) 
) 

echo.
echo 反向递减:
for /l %%w in (9,-1,1) do ( 
for /l %%k in (%%w,-1,1) do (
	set /a h=%%w*%%k
	set /p=%%w×%%k=!h! <nul 
	if /I %%k==1 echo.
	) 
) 
pause
  • 方式2.
代码语言:javascript复制
@echo off 
@REM 正向递增九九乘法表 
set num=0 
for /l %%i in (1,1,9) do ( 
  for /l %%j in (1,1,%%i) do call :multiply %%i %%j 
)
goto :end

@REM 关键部分
:multiply 
set /a num =1 
set /a var=%1*%2 
set var=%2×%1=%var% 
set var=%var% 
if %2 equ 1 (set var=%var:~0,5%) else set var=%var:~0,6% 
set str=%str% %var% 
if %num% equ %1 echo %str%&set str=&set num=0 
goto :eof 

@REM 退出程序
:end
pause
  • 方式3.
代码语言:javascript复制
@echo off 
@REM 正向递增九九乘法表 
setlocal enabledelayedexpansion 
for /l %%a in (1,1,9) do ( 
  for /l %%b in (1,1,%%a) do ( 
    set /a i =1 
    set /a ans=%%a*%%b 
    set ans=%%b×%%a=!ans! 
    set res=!res! !ans:~0,6! 
    if !i! equ %%a echo!res!&set res=& set i=0 
  ) 
) 
pause

温馨提示: 展示延时绑定的效果使用!变量名|h!,若不使用延迟绑定则%变量名|h%每次输出都为1,set /p 后加入<nul 表示不换行。


0x01 字符处理示例

1.使用批处理读取修改某文本文件到ini文件临时文件中

示例演示:

代码语言:javascript复制
@echo off >tmp.ini
for /f "tokens=1* delims=:" %%i in ('findstr /n ".*" 文件位置') do (
  if "%%j"=="" (echo.>>tmp.ini) else (
    echo %%j|find "被替换内容">nul && (
    call set tp=%%j & call echo %%tp:被替换内容=替换内容%%>>tmp.ini)||( >>tmp.ini echo %%j )
)
)
copy tmp.ini 文件位置 /y >nul || (attrib -s -a -r -h 文件位置 & copy tmp.ini 文件位置 /y >nul)
del tmp.ini
pause

偷偷的告诉你哟?极客全栈修炼】微信小程序已开放

可直接在微信里面直接浏览博主文章哟,后续将上线更多有趣的小工具。


2.使用批处理进行替换文本或者变量中的空格

示例演示:

代码语言:javascript复制
@echo off
@REM 处理文件文件中的空格

@REM 将文件内容赋值于变量text,此处值得学习。
set /p text=<file.txt
(for %%i in (%text%) do echo '%%i')>newfile.txt

@REM 处理变量值中的空格
for %%i in (%time:~0,2%) do set hour=%%i;echo %hour%

执行结果:

代码语言:javascript复制
[weiyigeek@localhost] $  echo %time%
#  8:51:49.25
[weiyigeek@localhost] C: $  for %i in (%time:~0,2%) do set hour=%i
[weiyigeek@localhost] C: $  set hour=8
[weiyigeek@localhost] C: $  echo %hour%
# 8

3.使用批处理脚本提取文件中的某一列

描述:假设有文件内容如下,其以列表形式显示了不同文件夹中文件数量,要求提取清单列中最后一列的数字。

代码语言:javascript复制
CHECK IS THERE ANY INTERFACE FILES IN I/O DIRS        
-------------------------------------------------------------------------------
08 JUN 18 16:40:24                                                          
                                                                               
FILES IN    ..BNK.DATAOFSDATAAIO.IN.DIR:   0
FILES IN                            OFS.IN:   0
FILES IN            SWIFT.FTPF.DE.I.MS000:   0
FILES IN            SWIFT.FTPF.DE.O.MS000:       93   

脚本示例

代码语言:javascript复制
@echo off
@REM 逐行处理&字段分割
setlocal enabledelayedexpansion
rem into current path
cd %~dp0
set FILENAME=%~dp0chkio_out.txt
for /f "delims=^" %%i in (%FILENAME%) do (
 @echo %%i | findstr /B "FILES" >nul && (set str=%%i & (for /f "tokens=4 delims= " %%m in ("!str!") do ( echo %%m )))
)
endlocal
 
pause

0x02 文件目录示例

1.使用批处理快速创建目录以及复制文件到创建的子目录中

脚本示例:

代码语言:javascript复制
@echo off
@REM 批量创建的目录把createQuxian.cmd文件复制到个子目录中
@REM 博客地址 blog.weiyigeek.top
mkdir delete other photo_bak photo_ksh photo_ksh.rar photo_ksh_backup  photo_ksh_log photo_rar photo_rar_log photo_sfzh_f photo_sfzh_z temp demo

for /f "delims=" %%N in ('dir /A:D /B') ^
do ( 
  xcopy createQuxian.cmd %%N /y
)
pause

2.在批处理中使用dir命令进行全系统查找文件

描述: 公司工作需要写DOS批处理代码,扩展思考了下如何查找文件,花了我很大精力才写出此脚本,因而记录下。

脚本示例:

代码语言:javascript复制
@echo off
 
@REM 变量延时绑定
setlocal enabledelayedexpansion
 
@REM 请求输入文件名,支持通配符
set /p filename=请输入要查找的文化名:
 
@REM 查看所有卷信息,赋值给变量,^表示换行符
for /f "delims=^" %%i in ('fsutil fsinfo drives') do (
	set juaninfo=%%i
)

@REM echo显示所有卷信息
echo %juaninfo%
 
@REM 遍历所有卷查找文件
for %%i in (%juaninfo%) do (
	echo %%i | findstr [A-Z]>nul && (set n=%%i & set target=!n!%filename% & set "target=!target: =!" & dir !target! /s /q)
)

执行结果:

代码语言:javascript复制
# 关键脚本脚本解释:
A. set n=%%i:表示将for循环得到的字符重新赋值给变量n;

B. set target=!n!%filename% :进行字符串拼接,因为dir查找命令必须要带上盘符,所以我们把盘符信息拼接到文件名之前;

C. set "target=!target:=!":进行字符替换,target冒号后面有个空格,B步骤拼接出来的字符串中间有空格,需要将空格去掉;---具体其搜索其他博文,这玩意也整了我好久;

D. dir !target! /s /q:最后一步,借助dir进行文件查找,/S 表示递归指定目录及其子目录;

3.使用批处理验证检查文件(清单)是否存在于某一目录

描述: DOS下的BAT批处理操作往往提供一个文件清单,然后对文件清单进行操作,如压缩、FTP/FTPS发送到远端、删除等,如何判断此文件清单的文件是否存在呢?解决此问题就有了此文。

文件清单: filelist.txt

代码语言:javascript复制
E:documentcode_new
E:java
E:picture11.PNG
E:picture12.PNG
E:picturenotexist.PNG

脚本示例:

代码语言:javascript复制
@echo off
@REM 将当前路径Push到缓存区,实际上使用了exist来循环遍历验证文件是否存在,此时产生的文件就在脚本的同级目录

pushd %~dp0
 
set FILENAME=filelist.txt
for /f "delims=^" %%i in (%FILENAME%) do (
	if exist %%i (
		echo %%i
	)else (
		echo [Warning] %%i is no exist
	)
)
popd
pause

参考地址: https://blog.csdn.net/zhaogang1993/article/details/80779706


0x03 软件调用示例

0.利用批处理中指定bat使用管理员权限运行

脚本示例:

代码语言:javascript复制
@echo off
@REM 使用管理员权限运行批处理脚本
@REM 博客地址 blog.weiyigeek.top
cd /d %~dp0
echo 正在使用管理权限打开 %1 脚本或者软件
start "" mshta vbscript:createobject("shell.application").shellexecute("""%1""","::",,"runas",1)(window.close)&exit

# RunsWithAdmin.bat
@echo off
@REM 被调用的批处理脚本示例
cmd.exe

执行结果:

1.使用批处理dump备份MySQL指定库

示例演示:

代码语言:javascript复制
@echo off
@REM 数据库备份案例
title mysqldump example
color 8a

@REM 接收位置参数变量
set user=%1
set pass=%2
set database=%3

@REM 验证位置参数
if "%user%"=="" goto usage  
if "%pass%"=="" goto usage
if "�tabase%"=="" goto usage

set BackupFile=�tabase%-�te%-%time:~0,2%%time:~3,2%%time:~6,2%%time:~8,2%.sql

@REM 备份到用户目录中
@REM C:UsersWeiyiGeekweiyigeek-2023-08-02-172836.8.sql
mysqldump.exe -u %1 -p%2 %3 > %userprofile%�ckupFile%
echo Successful Export MySQL DatabaseSQL File. 
goto end

:usage
echo Usage:%0 -u User -pPass DatabaseName

:end
pause

亲,文章就要看完了,不关注一下【全栈工程师修炼指南】吗?

2.使用批处理上传文件到FTP或者从FTP下载文件

描述: 此处,脚本分为两部分,第一部分为可执行bat脚本,第二部分为ftp命令集合存放文件。

执行notepad命令打开记事本,将下述ftp命令集合存放文件到D:ftp.txt。

代码语言:javascript复制
@REM 下载文件
open 192.168.1.166
ftp-user
passwd
passive
prompt off
lcd D:ftp
cd /home/ftp-user
mget *
close

@REM 上传文件
open 192.168.1.166
ftp-user
passwd
lcd D:ftp
cd /home/ftp-user
mput *
prompt on
bye
quit

执行批处理将执行在FTP中根据上述ftp指令进行下载或上传文件。

代码语言:javascript复制
@echo off
@REM 使用ftp指令进行下载或上传文件
ftp -s:D:ftp.txt

本文至此完毕,更多技术文章,尽情等待下篇好文!

原文地址: https://blog.weiyigeek.top/2023/7-29-625.html

0 人点赞