脚本的语法参考:《UEFI原理与编程》
在UEFI Shell 中可以执行Shell脚本。Shell 脚本是以.nsh为扩展名的文件。
Shell脚本语法简介
1.基本语法
脚本中的每一行表示一条语句,格式:
命令 [参数1] [参数2] #参数为可选项
注释 : 脚本内#后面内容标识注释。
命令行参数 : 执行脚本时可以带命令行参数,最多可以带10个参数。在脚本中%n可以获得第n个参数。
环境变量 : 在脚本中%var%获得环境变量var的值。
脚本返回值 : 脚本结束时可通过Exit命令设置返回值。
`exit [/b] [exit-code]` # /b 和 exit-code是可选项
`exit /b` #表示退出当前脚本;
exit 则退出UEFI shell。使用exit退出脚本时,exit-code将被赋值给环境变量lasterror。退出一个Shell实例时,exit-code将返回给调用者。执行完一个脚本后可以通过“echo %lasterror%”在屏幕输出脚本的退出码。
2.If条件句
if expression then
语句
else
语句
endif
条件表达式中,有以下几中情况:
(1)可以使用比较运算符
例: if %lasterror% == 0 then
运算符 | 含义 | 运算符 | 含义 | 运算符 | 含义 | 运算符 | 含义 |
---|---|---|---|---|---|---|---|
gt | 大于 | ugt | 无符号值大于 | ge | 大于等于 | uge | 无符号值大于等于 |
lt | 小于 | ult | 无符号值小于 | le | 小于等于 | ule | 无符号值小于等于 |
ne | 不等于 | eq | 相等 | == | 相等 |
(2)可以使用逻辑运算符:and or not
例:
if %lasterror% ne 0 and %lasterror% ne 1 then
(3)条件语句也可使用内置的布尔函数:
IsInt、Exists、Avaliable、Profile。 这些函数返回TRUE或FALSE。
例:if Exitsts fs0:\efi\boot\startup.nsh then
布尔函数 | 当返回值为TRUE时 | 当返回值为FALSE时 |
---|---|---|
IsInt(para) | para是数字 | para不是数字 |
Exitsts file | 存在文件file | 不存在文件file |
Avaliable file | file存在于path指定的目录或者当前目录 | 当前目录和指定目录均不存在file |
Profile para | Para匹配profile中某项 | Para不匹配profile中任一项 |
(4)if后面可以跟/i、/s、/i/s参数。
例 : if /s %uefishellversion% == “2.0” then
/s: 强制后面的语句为字符串比较;
/i:表示字符串比较时区分大小写。
(5)条件语句可以使用函数UefiError、PiError、OemError
这些函数用于将整数转化为相应的错误码
if %lasterror% == UefiError(8) then
3.for循环语句
两种格式:
第一种:
for %indexvar in set [;]
Endfor
set中的元素是以空格分隔的字符串或文件名。如果字符串长度小于255并且含有通配符,那么这个字符串将被当成文件名,并且在for循环执行前展开。
如:for %a in *.efi readme
echo %a
endfor
假设当前目录为FS0:,目录中存在redme、set.efi、set.c、test.c、test.efi四个文件,执行上述脚本后将输入:
FS0:\set.efi
FS0:\test.efi
FS0:\readme
第二种:
for %indexvar run (start end [step])
endfor
%indexvar中的indexvar是 ’a’-’z’ 或 ‘A’ -‘Z’ 中的一个字符。
%indexvar将从start变化到end,每次递增step。Step为1或-1时可省略。
4.goto语句
goto用于跳转到标号位置处。
标号的生命是 “:”在前,标号名在后。
如:
if not Exist %1 then
goto FileNotFound
endif
...
:FileNotFound
exit /b 1