BAT脚本的一些技巧写法

我以前一直以为bat不能像Linux的shell一样设置函数并且调用,事实上我发现这是可以的。不过由于批处理的特性是一行一行执行的,这种label的函数必须要写在文本的最后。如果写在了批处理命令的前面,bat会逐行运行里面的命令的。写在文档的最后面,并且在“函数区域”前跳过这些代码。

(顺便吐槽一下,这种函数的写法和linux的shell很不一样,shell的function中的命令必须写在命令的前面,让shell逐行运行一次,才能在后面的命令中被人调用。)

函数的写法:

::在这个例子中我试图写的一个函数起名为testfunction,它的操作就是运行一个echo命令。

::使用call命令,并且在后面写入函数名,函数名的前方写一个:代表这是一个label。

call :testfunction

::这个goto命令让批处理在运行的时候跳过所有函数的部分。

goto EOF

::从下面一行开始就是函数的部分,它们应该是bat脚本的最后部分,理论上不应该在下方再写任何的命令了。首先如同goto的命令一样,首先要先写一个lable

:testfunction

echo Test function is running.

rem exit /b 会让程序跳转到调用函数的命令处,而不是直接退出程序。

exit /b

:EOF

::以上就是示例脚本的所有内容。

当然你可以不把函数内容写在这个bat中,而是另外写一个bat文件,然后call这个bat的绝对路径,那也是可以的。为了方便我就暂时称呼我运行的脚本名字为a.bat,而调用的脚本为b.bat。

a.bat的内容是。

set a=aaa

call b.bat

echo %b%

pause

而b.bat的内容是

echo %a%

set b=bbb

在这两个脚本中a脚本和b脚本各自定义了一个变量,而没有定义另外一个脚本中定义的变量,但是echo的又互相是对方脚本中定义的变量。如果只有单独的脚本,两个脚本的echo命令是返回不了任何内容的。但是如果你运行了a脚本并且调用了b脚本,可以发现,call调用的脚本之间的变量是可以互通的。不过脚本之间的goto的label不能互通,即你不能在a脚本中goto到b的一个label中去。

而且不能不写call命令,如果不写而是直接写b脚本的路径,bat依旧可以运行,不过运行完b脚本之后,整个批处理就退出了。例如我们将a脚本中的call b.bat中的call去掉,那么脚本只会打印变量a的值,然后赋值变量b,但是不回会到a脚本再次打印b的值。

通过set /p 命令去获取另外一个文本文件里的值

写法是:

set /p var=<c:\path\to\file.txt

这样file.txt里的值就到了var这个变量里去了,不过这个写法要求txt只有一行,如果有多行,那么也只会取第一行的内容。

那如果想要其他的行,那么这个就要用到for循环了。通过for循环可以读取文本文件(或一个命令的结果)每一行的特性,将一行的内容赋值到一个变量里,不过如果光写for循环而不使用计数器的话,那么变量的值会被反复覆盖,仅保留最后一行的值。

set num=0

for /f "tokens=1" %%i in (‘wmic LogicalDisk where "Caption=‘C:‘" get Size ^| find /v /i "size"‘) do (

set /a num=!num!+1

if !num!==1 (set C_size=%%i)

)

要注意的是计数器由于是不停的变化的,因此要用延时变量,用!包起来而不是%,而for循环的变量是%%连续两个百分号表示的。如果输入的命令中有管道命令|,要用转移符^转译。

for的token参数可以决定一行根据指定的分隔符(默认是空格)分割成几段,取第几段。如果你写的是表格的话,那就是第几列,而num计数器可以在if里找行。这样的话这个循环就能取出列和行中的指定数据,赋值到一个变量里。

在bat中调用vbs。

当然本身的命令是非常简单的直接call就可以了,call xxx.vbs

不过这里要说的是将bat中的一些变量的值传递到vbs中去,

文件里调用

例如:

在bat中

set a=testmessage

call b.vbs /messageargs:%a%

在vbs中用

set wshnamed=wscript.arguments.named

msgbox wshnamed.item("messageargs")

这样的写法来获取bat变量。

以管理员身份运行bat

%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit

原文地址:https://blog.51cto.com/14580626/2445899

时间: 2024-10-11 22:20:22

BAT脚本的一些技巧写法的相关文章

Bat 脚本学习 (基础篇)

[转]Bat 脚本学习 2015-01-05 14:13 115人阅读 评论(0) 收藏 举报 基础部分: ====================================================================== 一.基础语法: 1.批处理文件是一个“.bat”结尾的文本文件,这个文件的每一行都是一条DOS命令.可以使用任何文本文件编辑工具创建和修改. 2.批处理是一种简单的程序,可以用 if 和 goto 来控制流程,也可以使用 for 循环. 3.批处理的

Android手机上,利用bat脚本模拟用户操作

---- 那么你就可以来看看这篇帖子了. 言归正传 利用bat脚本模拟用户操作,需要用到两点: ①就是adb命令了,adb命令可以用来模拟用户在手机上的操作 ②bat语言,就是批处理语言,主要用来进行逻辑处理,跟众多语言语法一样,批处理语言也包括for循环.if语句之类的语法: 一.adb命令 首先我们来介绍模拟用户在手机上操作的adb命令 input keyevent //发送键盘事件 用法说明: adb shell input keyevent "value" usage: inp

BAT脚本编写要点_特殊字符

BAT脚本编写要点(1)_特殊字符 分类: 其他 2011-03-20 00:58 5621人阅读 评论(0) 收藏 举报 脚本cdatecmdtreesystem 1. 点 与echo连用,作用是换行 示例1 [输出空行] echo. 2 > 定向符[输出] 将命令的输出进行重定向 [一般用于将结果写入文件] 注意 nul 为空设备 >nul 则用于屏蔽输出内容 [如 pause>nul] 示例2 [向1.txt中写入字符串 wind] echo wind>1.txt 3 >

bat 脚本之 使用函数

bat 脚本之 使用函数 摘自:https://blog.csdn.net/peng_cao/article/details/73999076 2017年06月30日 15:06:37 pengcao89 阅读数:4631 版权声明:本文为博主原创文章,未经博主允许不得转载.转载请注明出处: http://blog.csdn.net/peng_cao https://blog.csdn.net/cpwolaichile/article/details/73999076 综述 bat函数写法 ba

bat脚本

今天用bat脚本做了一个自动修改几个配置文件内容的功能. 因为只是初略的看了一下bat的语法,用到的知识点只涉及了 : rem   后面写注释 >      清空文件,然后向文件中写入内容 >>    向文件中追加内容 ^      如果要将10以内的数字单独作为 内容写入文件,需要在数字前加^ 如果要将一个%写入文件,必须要在.bat文件中写两个%% ren  修改文件夹名称 echo xxxinfo>c:\configpeth\ip_config.txt echo yyyyin

FAQ系列 | 如何在windows下用bat脚本定时备份mysql

并不是所有MySQL都运行在Linux下,windows下也需要做例行备份,下面是用bat脚本做自动化备份的例子,大家可以参考下. remrem C:\Program Files\WinRAR 需要放到 path 下,才能调用rar cli工具remrem 跳转到工作目录下f:cd f:\DBBAKrem 设置变量:备份文件名SET BAK_FILE=MY_DBBAK_%date:~0,-4%.sqlrem 设置变量:日志文件名SET LOG_FILE=MY_DBBAK.logrem 记录日志e

Bat脚本处理ftp超强案例解说

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://369369.blog.51cto.com/319630/842341 Bat脚本处理ftp超强案例解说 前言:    公司有几百台windows服务器,每次程序更新,如果是一台台拷数据,只怕安排十个人,一天都不一定做得完,所以就必须研究个全自动更新方案来,于是就 想到了FTP,做个主FTP站,在几百台客户机上启动BAT脚本,每30秒检测一次,如果主站有更新程序,就自动下载更新,

win7承载网络设置bat脚本实现

转眼就到五一了,依旧是宅了几天,上午看看NBA,晚上看看斯诺克,很舒服的小日子,话说问题都是生活中碰到的,今天算是深有体会,上午看NBA无意间发现手机看比用电脑要快好多,鉴于路由器老是不太稳定,所以决定用笔记本把网分出来试试,相信这种小把戏很多人都玩过吧,问题就是这样被发现的,虽然就是两三行代码的问题,但是还是上网找了一大堆的教程,甚至重新看了下win7 承载网络相关的东西,说来也巧,下午刚好看到了某大牛的bat学习日志,一时兴起决定写了bat脚本放在桌面上方便以后分网,果然,上网一查好多人都干

bat脚本参数 if goto choice for使用的学习笔记。

写过几次bat脚本,但一直没有总结,最近找到一个网页介绍bat,总结得很好,转自 http://www.jb51.net/article/49627.htm: 本文只总结我不会的,全面的看原网页就可以了. 1 参数 '%':参数符,%[1-9]表示参数,多个参数要用空格或tab隔开.变量可以从%0到%9,%0表示批处理命令本身,其它参数字符串用%1到%9顺序表示. 例3:C:根目录下一批处理文件名为t.bat,内容为: @echo off type %1 type %2 那么运行C:\>t a.