搜尋此網誌

2011年10月21日 星期五

EFI Shell commands -- SET(顯示、建立、改變、或刪除EFI Shell環境變數)

Displays, creates, changes, or deletes EFI Shell environment variables.

SET [-v] [sname [value]]
SET [-d ]

    -d       - Deletes the environment variable
    -v       - Volatile variable
    sname    - Environment variable name
    value    - Environment variable value

Notes:
    1. SET values are stored in EFI NVRAM and will be retained between boots
       unless the option -v is specified.
    2. The dmpstore command can be used to display EFI Shell NVRAM variables.
    3. Available NVRAM storage available for the set command will depend on
       the system implementation.
    4. SET may store NVRAM variables on the file system /efi/boot/bootstr.nvr
       if no NVRAM is implemented by the core EFI routines.

Examples:
  * To add an environment variable:
    Shell> set DiagnosticPath fs0:\efi\diag;fs1:\efi\diag

  * To display all environment variables:
    Shell> set
      * path           : .
        diagnosticPath : fs0:\efi1.1\diag;fs1:\efi1.1\diag

  * To delete an environment variable:
    Shell> set -d diagnosticpath
    Shell> set
      * path           : .

  * To change an environment variable:
    fs0:\> set src efi
    fs0:\> set
      * path : .;fs0:\efi\tools;fs0:\efi\boot;fs0:\
        src  : efi
    fs0:\> set src efi1.1
    fs0:\> set
      * path : .;fs0:\efi\tools;fs0:\efi\boot;fs0:\
        src  : efi1.1

  * To append an environment variable:
    Shell> set
      * path           : .
    Shell> set path %path%;fs0:\efi\tools;fs0:\efi\boot;fs0:\
    Shell> set
      * path           : .;fs0:\efi\tools;fs0:\efi\boot;fs0:\

  * To set a volatile variable that will disappear at the next boot:
    Shell> set -v EFI_SOURCE c:\project\EFI1.1
    Shell> set
      * path       : .;fs0:\efi\tools;fs0:\efi\boot;fs0:\
      * EFI_SOURCE : c:\project\EFI1.1

13 則留言:

  1. 請問一下 如何讓環境變數遞增呢
    我想讓我的系統在shell底下重開機去計算次數
    感謝

    回覆刪除
    回覆
    1. 這個批次檔每執行一次就加一,最大到20
      ##===========================================
      ##存成test.nsh
      ##===========================================
      echo -off
      if exist %myval% then
      set myval 0
      endif
      for %a in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
      if %myval% == %a then
      echo "[ %a ]"
      set mylock 1
      else
      if %mylock% == 1 then
      set mylock 0
      set myval %a
      endif
      endif
      endfor
      echo "%myval%"
      set -d mylock
      echo -on
      ##===========================================
      fs0:\>test.nsh
      test> echo -off
      [ 0 ]
      1

      在執行一次
      fs0:\>test.nsh
      test> echo -off
      [ 1 ]
      2

      在執行一次
      fs0:\>test.nsh
      test> echo -off
      [ 2 ]
      3

      刪除
  2. Thank you.
    但我比較想要的是沒有限制次數的去跑
    等到我跑到一定時間,才去看次數
    Anyway, 感謝

    回覆刪除
    回覆
    1. 這個程式範圍從0~19999次,這樣應該夠測3天的reboot test吧!!
      這次加了goto加快它的處理速度。
      如果要大於這個範圍,可能需要自己寫一支AP。
      因為Shell都靠String來處理。 :)

      ##===========================================
      ##存成t1.nsh
      ##===========================================
      echo -off
      if exist %myval% then
      set myval 0
      endif
      for %a run (0 19999)
      if %myval% == %a then
      echo "[ %a ]"
      set mylock 1
      else
      if %mylock% == 1 then
      set mylock 0
      set myval %a
      goto Leave_For
      endif
      endif
      endfor
      :Leave_For
      echo "%myval%"
      set -d mylock
      echo -on

      刪除
  3. 謝謝
    這樣就可以在不用ap的情況下把這個環境變數當計數器了^^

    回覆刪除
  4. 版主您好,我想請問你if exist %myval%這三行的用意應該是當%myval這個環境變數不存在時就將它建立並初始為0
    可是我實在不了解為什麼不是用if not exist,另外用%myval%是代表它的值,那麼當%myval > 0時,if exist %myval%應該就等於 if exist 1…,這樣是不是就會一直為true,但實際跑起來又不是那麼一回事,可以請您指點一下if exist %myval%的意思嗎?感謝唷。

    回覆刪除
    回覆
    1. if exist %myval% then
      set myval 0
      echo "ABC"
      endif
      這幾行是檢查,如果環境變數myval不存在,它將被建立並設為0。
      你可以加一行echo "ABC" 在這判斷條件中,
      然後執行
      fs0:\>set -d myval 刪除此環境變數

      在執行
      fs0:\> test
      test> echo -off
      ABC 此環境變數被建立並設為0
      [ 0 ]
      1

      執行第二次
      fs0:\> test
      test> echo -off
      第二次執行並未進入此判斷條件中
      [ 1 ]
      2
      fs0:\>

      試試看吧!!!

      刪除
  5. 你好,
    請問一下在uefi中,有像windows的set /p可以等待使用者輸入變數值的指令嗎?

    回覆刪除
    回覆
    1. set指令裡目前沒有-p的參數,或許你可以用下列指令取代:
      1. pause(http://samfreetime.blogspot.tw/2011/10/efi-shell-commands-pause.html)中斷程式。
      2. bcfg 開機選單管理指令(http://samfreetime.blogspot.hk/2012/09/efi-shell20-commands-bcfgnvram.html)。
      3. 或自行撰寫一個應用程式吧!

      刪除
  6. 你好,
    請問在EFI Shell下能做到存取16進制的數字 並且對他做4次+1的動作
    EX:A->B D->E F->0 如果到F後會回到一開始 重複0~F這樣的程式
    感謝

    回覆刪除
    回覆
    1. 將此程式存成t3.nsh
      ======t3.nsh==================================
      echo -off

      if not exist %2% then
      echo [[%2]]
      set myval_xx %2%
      endif

      if exist %myval_xx% then
      set myval_xx 0
      endif

      if not exist %1% then
      echo [[%1]]
      set myval_x %1%
      endif

      if exist %myval_x% then
      set myval_x 0
      endif

      for %c in 1 2 3 4
      set not_skip 1
      if %myval_x% == F then
      if %myval_xx% == F then
      set myval_x 0
      set myval_xx 0
      set mylock_x 0
      set mylock_xx 0
      set not_skip 0
      endif
      endif

      if %not_skip% == 1 then
      set mylock_x 0
      for %b in 0 1 2 3 4 5 6 7 8 9 A B C D E F
      if %myval_x% == %b then
      if %myval_xx% == F then
      set myval_xx 0
      set mylock_x 1
      set mylock_xx 0
      else
      for %a in 0 1 2 3 4 5 6 7 8 9 A B C D E F
      if %myval_xx% == %a then
      set mylock_xx 1
      else
      if %mylock_xx% == 1 then
      set mylock_xx 0
      set myval_xx %a
      set myval_x %b
      endif
      endif
      endfor
      endif
      else
      if %mylock_x% == 1 then
      set mylock_x 0
      set myval_x %b
      endif
      endif
      endfor
      endif

      echo "0x%myval_x%%myval_xx%"
      endfor

      set -d mylock_x
      set -d mylock_xx
      echo -on
      ========================================
      Examples:
      輸入時英文請用大寫
      fs0:\> t3.nsh F F
      t3.nsh> echo -off
      [[F]]
      [[F]]
      0x00
      0x01
      0x02
      0x03

      fs0:\> t3
      t3> echo -off
      0x04
      0x05
      0x06
      0x07

      fs0:\> t3
      t3> echo -off
      0x08
      0x09
      0x0A
      0x0B

      fs0:\> t3
      t3> echo -off
      0x0C
      0x0D
      0x0E
      0x0F

      fs0:\> t3
      t3> echo -off
      0x10
      0x11
      0x12
      0x13

      fs0:\> t3.nsh F E
      t3.nsh> echo -off
      [[E]]
      [[F]]
      0xFF
      0x00
      0x01
      0x02

      fs0:\> t3.nsh 5 5
      t3.nsh> echo -off
      [[5]]
      [[5]]
      0x56
      0x57
      0x58
      0x59

      試試看吧!!!!

      刪除
  7. 非常謝謝Liao Ming-Yang 你的回覆幫助我很多 再次感謝你!!!

    回覆刪除
  8. 版大您好,
    請問如何清楚計數次數呢?

    回覆刪除