程序猿必备技能-Bat脚本

Batch 脚本(批处理脚本)是在 Windows 操作系统中使用的一种脚本语言,用于自动化执行一系列命令。Batch 脚本是由 .bat 或 .cmd 文件扩展名标识的文本文件,这些文件可以被 Windows 的命令行解释器(如 cmd.exe)执行。Batch 脚本可以用来执行许多常见的任务,如文件操作、环境变量设置、程序启动等。

Batch 脚本的基本语法


Batch 脚本的基本语法包括:

命令:可以是内部命令(如 dir、cd、echo 等)或外部命令(如应用程序路径)。
批处理标签:用于标记脚本中的位置。
条件语句:用于根据条件执行不同的命令。
循环结构:用于重复执行某些命令。
变量:用于存储数据并在脚本中使用。
基本示例
下面是一个简单的 Batch 脚本示例,用于显示当前目录的内容,并提示用户确认后再退出:

@echo off
echo Current directory contents:
dir
pause 


Batch 脚本的关键要素


注释:批处理脚本支持注释,使用 rem 或 :: 开头的行会被忽略。
变量:批处理脚本支持变量,可以通过 %variable% 来引用变量。变量可以通过命令行参数、内置命令或手动赋值来设置。
命令行参数:批处理脚本可以接收命令行参数,这些参数可以从 %%1、%%2 等访问。
手动赋值:可以在脚本中直接赋值给变量,如 set var=value。
环境变量:可以使用系统环境变量,如 %PATH%。

set MY_VAR=Hello
echo %MY_VAR%


条件语句:使用 if 语句来根据条件执行不同的命令。
文件存在性检查:

if exist file.txt (
    echo File exists.
) else (
    echo File does not exist.
)


字符串比较

set str=hello
if "%str%"=="hello" (
    echo String matches.
) else (
    echo String does not match.
)


循环结构:使用 for 循环来迭代文件、目录或命令输出。
迭代文件:

for %%f in (*.txt) do (
    echo Found file: %%f
)


迭代命令输出:

for /f "delims=" %%f in ('dir /b *.txt') do (
    echo Found file: %%f
)


批处理标签和 goto:使用标签和 goto 语句来跳转到脚本中的不同位置。

示例:

:start
echo Hello!
pause
goto end

:end
echo Goodbye!


子脚本调用:可以使用 call 命令来调用另一个批处理脚本或当前脚本中的函数。 示例:

call :my_function
exit /b

:my_function
echo This is a function.


复杂示例


下面是一个更复杂的示例脚本,用于备份当前目录下的所有 .txt 文件到另一个目录,并在备份完成后显示一个消息框:

@echo off
setlocal EnableDelayedExpansion

rem 设置备份目标目录
set BACKUP_DIR=C:\Backup\TXT_Backup

rem 创建备份目录(如果不存在)
if not exist "%BACKUP_DIR%" mkdir "%BACKUP_DIR%"

rem 遍历当前目录下的所有 .txt 文件并复制到备份目录
for %%f in (*.txt) do (
    copy "%%f" "%BACKUP_DIR%\%%~nf_!DATE:~-4,4!!DATE:~-7,2!!DATE:~-10,2!.txt" /y
)

rem 显示备份完成的消息框
msg * Backup completed successfully!

endlocal


常见命令


以下是一些常用的 Batch 脚本命令:

echo:显示一行文本。
pause:暂停脚本执行,直到用户按下任意键。
cd:更改当前目录。
dir:列出目录内容。
md 或 mkdir:创建目录。
rd 或 rmdir:删除目录。
copy:复制文件。
move:移动文件。
del 或 erase:删除文件。
if:条件语句。
for:循环语句。
set:设置变量。
call:调用另一个批处理脚本或当前脚本中的函数。
exit:退出批处理脚本。
msg:显示消息框。

更复杂的示例

下面的示例为一个启动服务的例子,包含两个文件:启动核心.bat 和 启动服务.tpl

启动核心.bat

@echo off
setlocal enabledelayedexpansion
:SECTION_START
echo ********************************************************************
echo *      即将重启st服务:
echo *      清理上日日志
echo *      重启( 仲裁、核心、管理前置、交易前置、网关、消息中心、日志服务器)
echo *********************************************************************
set yesno=a
set /p yesno=" 即将执行清理查询核心日志操作(rm -rf ./log),请确认(y or n):
if /i "%yesno%"=="n" (goto SECTION_END)
if /i not "%yesno%"=="y" (goto SECTION_START)

echo -----------------------------清理日志开始------------------------
call :FUNC_DELETE_FILES %1 query1 ./log
call :FUNC_DELETE_FILES %1 query2 ./log
echo ------------------------------清理日志结束------------------------

:SECTION_ST_CLEARSTART
set yesno=a
set /p yesno=" 即将清流重启ST,请确定(y or n):
if /i "%yesno%"=="n" (goto SECTION_END)
if /i not "%yesno%"=="y" (goto SECTION_ST_CLEARSTART)

echo --------------------------------------------------------------------
echo *      即将停止 trade...
echo --------------------------------------------------------------------     
call :FUNC_STOP_SVR_FROM_FILE %1 trade1 %5
call :FUNC_STOP_SVR_FROM_FILE %1 trade2 %5
call :FUNC_STOP_SVR_FROM_FILE %1 query1 %5
call :FUNC_STOP_SVR_FROM_FILE %1 query2 %5


echo --------------------------------------------------------------------    
echo *      即将启动 trade...
echo --------------------------------------------------------------------     
call :FUNC_START_SVR_FROM_FILE %1 query1 0 0 %5
call :FUNC_START_SVR_FROM_FILE %1 query2 0 0 %5
call :FUNC_START_SVR_FROM_FILE %1 trade1 0 1 %5
call :FUNC_START_SVR_FROM_FILE %1 trade2 0 1 %5

echo -------------------------------------------------------------------- 

echo *      程序启动成功,按任意键退出 ...
echo --------------------------------------------------------------------

:SECTION_END
pause
exit

启动服务.tpl

name=启动服务
note=启动服务器上ST服务
param=CONFIG|服务配置|info.txt中配置的服务名称
param=STATUS|标志|0:模式0 1:模式1
param=PWD|密码串
========================================================================
call :FUNC_START_SVR_FROM_FILE %1 {CONFIG} {STATUS} {PWD}
========================================================================
rem ----------------------------------------------------
rem 通过加载info.txt中的指定配置启动linux进程
rem call :FUNC_START_SVR_FROM_FILE 工作目录 ipinfos中配置的名称 标志
rem -------------------------------------------------------------------------
:FUNC_START_SVR_FROM_FILE
set SVRFILE=config/info.txt
if not exist %SVRFILE% (
    echo 请先配置%SVRFILE%!
    pause
    goto :eof
)
set FIND=no
for /F "tokens=1,2,3,4,5,6,7"  %%C in (%SVRFILE%) do (
    if /I %%C==%2 (
        set FIND=yes
        set HOST=%%D
        set USER=%%E
        set PWD=%%F
        set CFG=%%G.xml
        set SVR=%%H
        set APPNO=%%I
    )
)
if "%FIND%"=="no" (
    echo %SVRFILE%中未找到%2的配置信息
    pause
    goto :eof
)

set pass_str=%4
set num=0
set pwd_flag=a
set check_flag=a

if not "%PWD%"=="*" set pwd_flag=b

if "%pass_str%"==" " set check_flag=b
if not defined pass_str set check_flag=b
if "%check_flag%" == "b" (
    if "%pwd_flag%" == "a" (
        echo 当前配置为从监控服务器获取密码,但密码串为空,请检查info和脚本的配置是否正确
        goto :eof
    )
)

if "%pwd_flag%" == "a" (
    set pass_words=%pass_str:`= %
    :passloop_start_svr
    for /f "tokens=1,2,3,*" %%i in ("%pass_words%") do (
        if %%i == %HOST% (
            if %%j == %USER% (
                set num=1
                set PWD=%%k    
            )
        )
    set pass_words=%%l)
    if defined pass_words goto passloop_start_svr
    if %num%==0 (
        echo %2未获取到密码信息,主机IP %HOST% 主机用户名 %USER%
        goto :eof
    )
)

call :FUNC_START_SVR %1 %HOST% %USER% %PWD% %CFG% %SVR% %APPNO% %3
goto :eof

rem --------------------------------------------------------------------------
rem 启动linux服务器进程
rem call :FUNC_START_SVR 工作目录 地址 用户 密码 配置文件 启动进程 服务编号 清流标志
rem ------------------------------------------------------------------------------------
:FUNC_START_SVR
SET Today=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%
SET Today=%Today: =0%
echo source ~/.bash_profile > %1\%5#%7.txt
echo cd workspace >> %1\%5#%7.txt
echo stserver -f %5 -start %6 -t ar -s %7 -status %8 -c r log/%Today%_%5.out ^& >> %1\%5#%7.txt
echo plink -l %3 -pw %4 %2 -m %1\%5#%7.txt > %1\cmd.out >> %1\%5#%7_0.txt
plink -l %3 -pw %4 %2 -m %1\%5#%7.txt > %1\cmd.out
echo lcd %1 > %1\%5#%7_1.txt
echo get workspace/log/%Today%_%5.out >> %1\%5#%7_1.txt
echo bye >> %1\%5#%7_1.txt
echo psftp %2 -l %3 -pw %4 -b %1\%5#%7_1.txt > %1\cmd.out >> %1\%5#%7_2.txt
psftp %2 -l %3 -pw %4 -b %1\%5#%7_1.txt > %1\cmd.out
type %1\%Today%_%5.out
del %1\cmd.out
goto :eof

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/878123.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

衡石科技BI的API如何授权文档解析

授权说明​ 授权模式​ 使用凭证式(client credentials)授权模式。 授权模式流程说明​ 第一步,A 应用在命令行向 B 发出请求。 第二步,B 网站验证通过以后,直接返回令牌。 授权模式结构说明​ 接口说明​ 获取a…

【贪心 决策包容性 】757. 设置交集大小至少为2

本文涉及知识点 贪心 决策包容性 LeetCode757. 设置交集大小至少为2 给你一个二维整数数组 intervals ,其中 intervals[i] [starti, endi] 表示从 starti 到 endi 的所有整数,包括 starti 和 endi 。 包含集合 是一个名为 nums 的数组,并…

Quasar V2.16.4 新版发布,基于 Vue 3 的前端开发框架,一套代码发布到多端

Quasar 又发布新版本了,性能优秀的 Vue 组件开发框架,时隔3年再次推荐给大家。 早在2021年,我就写了一篇简单的文章向大家推荐了 Quasar 这款 Vue.js 开发框架,如今3年过去了,Quasar 发展得很好,更新频率依…

H5开发有哪些技巧?

随着现代社会的飞速发展,网页开发已经从传统的HTML、CSS、JavaScript往H5发展。H5也称为HTML5,可以理解为是HTML的升级版,具有更加优秀的性能、更加完善的功能和更加多样的体验。因其灵活性和跨平台特性,成为了各类移动应用和网页…

面试常问! transformer中dk的大小,以及为什么设成这样,维度,原文分析。

目录: 原文 :翻译:流程:原因: 原文(多头注意力部分) : 李沐b站论文精读 论文网盘下载:链接 提取码: vm3d 翻译: 在这项工作中,我们采用了 h8 个并行注意力层&#xff…

Linux远程管理—SSH协议

SSH协议是远程连接的安全性协议,该协议可以有效防止远程管理过程中的信息泄漏,是西安传输数据加密,能够防止DNS和IP欺骗,传输数据压缩,加快传输速度。 安全验证方法有口令验证和密钥验证两种实现手段,该协…

线上剧本杀小程序,线上游戏新体验

剧本杀作为当下热门的社交型游戏方式,成为了大众社交娱乐的选择,为大众带来新的游戏体验。在数字化发展时期,线上剧本杀为大众带来了新鲜的游戏体验,它打破了时间空间限制,让玩家在手机上体验虚拟游戏,通过…

Oracle发邮件时SMTP服务器配置方法与步骤?

Oracle发邮件功能如何配置?如何优化Oracle发信性能? 为了实现自动化报告和通知,Oracle发邮件功能变得尤为重要。通过配置SMTP服务器,Oracle可以轻松地发送电子邮件。AokSend将详细介绍如何配置Oracle发邮件时的SMTP服务器&#x…

IDEA 编译项目时卡在Parsing java,最终报out of memory

今天在项目运行的时候莫名其妙报错: 报错内容: java.lang.OutOfMemoryError: GC overhead limit exceeded原因: 通常是因为堆内存太小,无法有效管理正在创建和销毁的对象。 解决方法: 在 IDEA 的安装目录下找到 bi…

ABB巨资收购一家电气龙头,为当年卖给日立电气业务回血

导语 大家好,我是社长,老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 战略扩张:ABB携SEAM集团深耕电气服务市场 在电气服务领域,ABB再次展现了其强大的市场扩张能力。近日,ABB宣布…

【CanMV K230】外接传感器

【CanMV K230】外接传感器 外接LED灯 B站视频链接 抖音链接 我们后面主要做是机器视觉。K230能帮我们捕捉到图像信息。更多小功能需要我们自己来做。 比如舵机抬杆,测温报警等 都需要我们外接传感器。 本篇就来分享一下如何使用K230外接传感器 首先需要知道K230…

栈OJ题——有效的括号

文章目录 一、题目链接二、解题思路三、解题代码 一、题目链接 有效的括号 题目描述:给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。括号匹配。 二、…

Pycharm module ‘serial‘ has no attribute ‘Serial‘

已经pip install serial 已经提示安装成功了,提示没有Serial的属性,经过查询 ,发现安装的模块不对,应该安装pyserial模块。 解决步骤 第一步:卸载serial pip uninstall serial 第二步:安装pyserial pip u…

【2025校招】4399 NLP算法工程师笔试题

目录 1. 第一题2. 第二题3. 第三题 ⏰ 时间:2024/08/19 🔄 输入输出:ACM格式 ⏳ 时长:2h 本试卷分为单选,自我评价题,编程题 单选和自我评价这里不再介绍,4399的编程题一如既往地抽象&#xff…

xss-labs通关攻略 11-15关

第十一关:less-11 步骤一:利用burp抓包 步骤二:添加referer:click me!" type"button" οnmοuseοver"alert(/xss/)进行放包 第十二关:less-12 步骤一:利用burp抓包 步骤二:修改User A…

【机器学习】独立成分分析的基本概念、应用领域、具体实例(含python代码)以及ICA和PCA的联系和区别

引言 独立成分分析(Independent Component Analysis,简称ICA)是一种统计方法,用于从多个观察到的混合信号中提取出原始的独立信号源 文章目录 引言一、独立成分分析1.1 定义1.2 独立成分分析的基本原理1.3 独立成分分析的步骤1.3.…

RACL: Adversarially Robust Neural Architectures

RACL: 对抗鲁棒网络架构 论文链接:https://arxiv.org/abs/2009.00902v2 Abstract 深度神经网络(DNN)容易受到对抗性攻击。现有的方法致力于开发各种鲁棒训练策略或正则化来更新神经网络的权值。但除了权重之外,网络中的整体结构和信息流是由网络架构明…

模块一(任务3):WDM系统原理解读

一、WDM的概念及波段划分 1、WDM系统概念 WDM系统就像高铁系统一样,这里可以将一根光纤看做是一个多车道的高速铁路。 把不同波长的光信号组合起来(也就是复用),进入到同一根光纤中进行传输,在接收端将组合波长的光信…

数据库mysql集群主从、高可用MGR、MHA技术详解

一、安装数据库mysql步骤 环境:红帽7.9系统 安装依赖 yum install cmake gcc-c openssl-devel ncurses-devel.x86_64 libtirpc-devel-1.3.3-8.el9_4.x86_64.rpm rpcgen.x86_64 -y 将下载的MySQL软件包解压并cd到mysql的目录下 [rootmysql-node10 ~]# tar zxf mysq…

数据结构(邓俊辉)学习笔记】优先级队列 08——左式堆:结构

文章目录 1. 第一印象2. 堆之合并3. 奇中求正4. NPL5. 左倾性6. 左展右敛 1. 第一印象 在学习过常规的完全二叉堆之后,我们再来学习优先级队列的另一变种,也就是左式堆。所谓的左式堆,也就是在拓扑形态上更加倾向于向左侧倾斜的一种堆&#…