Shell 下可以通过 Set 命令获取和设置当前的环境变量。比如:在模拟环境下运行 Set 可以看到默认的 path 路径:
这里介绍一下如何使用代码来实现这个功能。
首先介绍取得环境变量的函数,在 \ShellPkg\Include\Library\ShellLib.h 中可以看到他的原型。输入函数是要读取的环境变量名称。比如: path
/** Return the value of an environment variable. This function gets the value of the environment variable set by the ShellSetEnvironmentVariable function. @param[in] EnvKey The key name of the environment variable. @retval NULL The named environment variable does not exist. @return != NULL The pointer to the value of the environment variable. **/ CONST CHAR16* EFIAPI ShellGetEnvironmentVariable ( IN CONST CHAR16 *EnvKey );
其次,介绍一下设置环境变量的函数,同样在在 \ShellPkg\Include\Library\ShellLib.h 中可以看到他的原型。输入的参数是:环境变量名称,要设置的值,还有一个是该变量是否为易失的。如果设置为非易失,那么下次重新其中之后这个值还会存在Shell中。
/** Set the value of an environment variable. This function changes the current value of the specified environment variable. If the environment variable exists and the Value is an empty string, then the environment variable is deleted. If the environment variable exists and the Value is not an empty string, then the value of the environment variable is changed. If the environment variable does not exist and the Value is an empty string, there is no action. If the environment variable does not exist and the Value is a non-empty string, then the environment variable is created and assigned the specified value. This is not supported pre-UEFI Shell 2.0. @param[in] EnvKey The key name of the environment variable. @param[in] EnvVal The Value of the environment variable @param[in] Volatile Indicates whether the variable is non-volatile (FALSE) or volatile (TRUE). @retval EFI_SUCCESS The operation completed sucessfully @retval EFI_UNSUPPORTED This operation is not allowed in pre-UEFI 2.0 Shell environments. **/ EFI_STATUS EFIAPI ShellSetEnvironmentVariable ( IN CONST CHAR16 *EnvKey, IN CONST CHAR16 *EnvVal, IN BOOLEAN Volatile );
编写一个测试的 Application
#include <Uefi.h> #include <Library/UefiLib.h> #include <Library/ShellCEntryLib.h> #include <Library/MemoryAllocationLib.h> #include <Library/BaseMemoryLib.h> #include <Protocol/UnicodeCollation.h> #include "ShellLib.h" extern EFI_BOOT_SERVICES *gBS; extern EFI_SYSTEM_TABLE *gST; extern EFI_RUNTIME_SERVICES *gRT; int EFIAPI main ( IN int Argc, IN CHAR16 **Argv ) { EFI_STATUS Status; CONST CHAR16 *Result; Result=ShellGetEnvironmentVariable(L"path"); if (Result!=NULL) { Print(L"Get path=[%s]\n",Result); } Status=ShellSetEnvironmentVariable(L"labz1",L"100",TRUE); if (EFI_ERROR(Status)) { Print(L"Set Env. variable error\n",Result); } Status=ShellSetEnvironmentVariable(L"labz2",L"200",FALSE); if (EFI_ERROR(Status)) { Print(L"Set Env. variable error\n",Result); } Result=ShellGetEnvironmentVariable(L"labz1"); if (Result!=NULL) { Print(L"Get labz1=[%s]\n",Result); } return EFI_SUCCESS; }
需要特别注意的地方是:在 NT32 模拟环境下,ShellSetEnvironmentVariable 函数无法使用:
上面的代码首先显示一下当前的 path 变量,之后设置2个变量分别是 lab1=100和lab2=200.
下面的都是在实体机上进行测试的(测试平台:Kabylake HDK Board)
运行之后我们再检查环境变量可以看到 labz1 和 labz2 已经设置进去了。
重启之后,再次检查可以看到变量labz2仍然存在
比如,某天你需要在BIOS中加入一个重启动测试的代码,可以考虑将重启次数放在环境变量中。
完整的代码下载 envtest