计算机 · 2021年12月19日 0

windows脚本编程

获取帮助信息

  • 使用help查看cmd帮助信息
  • 使用command /?查看命令帮助信息

外国网友写的简易Batch教程

基本概念

评论

REM This is a comment!
::This is a comment!

也可以,但是好像和FOR循环混在一起的时候会有bug。

关闭代码显示

@ECHO OFF

变量

环境变量

SET foo=bar
ECHO %foo%

/A选项允许数学运算

SET /A foo=2+2

特殊环境变量: TEMP(临时目录), RANDOM(随机数), CD(当前目录), ERRORLEVEL(上个命令返回值,正常退出的话一般应该返回0)。
变量范围默认是全局的,如果想要局部的,使用SETLOCALENDLOCAL

控制流

IF

IF [NOT] CONDITION (
...
) ELSE (
...
)

CONDITION可以是DEFINED, EXIST等关键字,也可以用compare-op:EQU、NEQ、LSS、LEQ、GTR、GEQ。比较字符串是否相等可以用==符号,可以用/I忽略大小写区别。

FOR

FOR %variable IN (set) DO command [command-parameters]
  • 在batch脚本中,需要使用%%variable
  • 对于set可以直接用逗号分隔的形式枚举要遍历的值,如(1, 2, 3);也可以也用通配符的方式来获得相匹配的文件/文件夹名称的集合,如(*.pcm)
  • 几个简单选项:
    • /D 只匹配目录
    • FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters] 对于以[drive:]path为根的目录树,对其下的每个目录都执行一遍后面的FOR语句。
    • FOR /L %variable IN (start, step, end) DO command [command-parameters] 以startend为开始和结束(均包含),以step为步进,产生一个序列,对这个序列中的每个值进行遍历。
  • 更复杂的选项: FOR /F ["options"] %variable IN (file-set|"string"|'command') DO command [command-parameters]
    “options”可选关键字列表:
关键字含义
eol=c指一个行注释字符的结尾(就一个)
skip=n指在文件开始时忽略的行数
delims=xxx分隔字符集。默认是用空格和制表符作分隔字符集
tokens=x,y,m-n看不懂windows的说明,估计机器翻译的吧
usebackq同看不懂
  • FOR变量的替换
语法含义
%~I删除任何引号(“),扩展%I
%~fI将%I扩展到一个完全合格的路径名
%~dI仅将%I扩展到一个驱动器号
%~pI仅将%I扩展到一个路径
%~nI去掉扩展名,仅保留文件名
%~xI仅保留扩展名
%~sI扩展的路径只含有短名
%~aI将%I扩展到文件的文件属性
%~tI将%I扩展到文件的日期/时间
%~zI将%I扩展到文件的大小
%~$PATH:I根据$PATH指定的路径,找到第一个和名为%I的文件,并将%I扩展为该文件的fully qualified name。如果找不到就将%I扩展为空字符串。

可以同时使用多个修饰符,如%~ftzaI
%I可以用其他的循环变量替代,PATH变量也可以用其他有效数值替代。但是%~语法必须用一个有效的FOR循环变量终止。

  • FOR循环的一个坑爹之处在于需要理解并运用ENABLEDELAYEDEXPANSION这种机制,否则你会发现FOR循环并没有如你想象中那样工作。

函数(FUNCTION/PROCEDURE)

定义函数

类似于定义C里面的一个label:

:foo
ECHO I am a fool!

调用函数

CALL foo arg1 arg2 [...]

返回值

EXIT /B

在调用函数后,可以读取%ERRORLEVEL%以获得其返回值。

函数的结束

函数可以用EXIT /B [RETURN VALUE]返回,也可以用GOTO :EOF结束一个函数。

如何避免main logic落入函数的代码块:

可以用EXIT /B [RETURN VALUE]或者用GOTO :EOF

函数参数/命令行参数

参数名含义
%0脚本名/函数名
%1第一个参数
%2第二个参数

可以用shift操作丢弃第一个参数,再把后面的参数依次往前移动,即将第二个参数从%2的位置移到%1,第三个参数从%3的位置移到%2的位置,依次类推。

对于函数参数或者命令行参数可以使用FOR循环的各种扩展修饰符。

使用命名参数

SET VAR1=%1
SET VAR2=%2

延迟展开 (DELAYED EXPANSION)

SETLOCAL ENABLEDELAYEDEXPANSION

使用!variable!而不是%variable%以阻止解释器在读入脚本的时候就把变量值给展开了(这往往不是我们想要的)。如果想要使用Delayed Expansion,那么对于指定的变量在任何时候都应该使用!variable!,不要混用%variable%

更高级的脚本编程

需要使用PowerShell。