請選擇 進入手機版 | 繼續訪問電腦版

NoName Team 電腦資訊討論區

 找回密碼
 我要註冊
搜索
12
返回列表 發新帖
樓主: start1119

[問題] shellx64.efi 版本

[複製鏈接]
 樓主| 發表於 2020-1-2 10:05:12 | 顯示全部樓層
阿達金田一 發表於 2020-1-1 02:46
這就是我前面說的路徑問題...
auto startup.nsh 可能當前路徑是 shell> ...不是 fs0:\
(這個我前面有說錯. ...

恩 確實是 重開機沒有進入fs0: 的問題
但是跑了
[Bash shell] 純文本查看 復制代碼
# Check and cd startup.nsh path
for %b in fs0 fs1 fs2 fs3 blk0 blk1 blk2 blk3
    if exist %b:\startup.nsh then
       %b:
       cd\
       goto Leave_For2
    endif
endfor
:Leave_For2

還是沒有進入fs0:

現在是加一行已知位置
[Bash shell] 純文本查看 復制代碼
@echo -off
 
# Set Startup delay time for 0 sec
set StartupDelay 0
 
# Check Counter
if not isInt(%Counter%) then
   set Counter 1
   goto Leave_For1
endif
for %a run (%Counter% 1%Counter%)
    if %Counter% ne %a then
       set Counter %a
       goto Leave_For1
    endif
endfor
:Leave_For1
if %Counter% lt 1 then
   set Counter 1
endif 
 
# Check and cd startup.nsh path
for %b in fs0 fs1 fs2 fs3 blk0 blk1 blk2 blk3
    if exist %b:\startup.nsh then
       %b:
       cd\
       goto Leave_For2
    endif
endfor
:Leave_For2
 
# Set Log File
set Log startup.nsh.%Counter%.log
 
echo Boot Coutner = %Counter%
fs0:
echo Boot Coutner = %Counter% >> %Log%
echo Current Working Directory = %cwd%
echo Current Working Directory = %cwd% >> %Log%
date >> %Log%
time >> %Log%
echo " " >> %Log%
echo === PCI === >> %Log%
pci >> %Log%
 
#Wait for 3 sec then system warm reboot
stall 5000000
reset -w

才可運行
有試過%b:
卻環境在shell上無法辨識
 樓主| 發表於 2020-1-2 10:52:19 | 顯示全部樓層
另外檔名可能用 time 值名命嗎?
將多筆存入同一文件
突然覺得用Counter檔案似乎太多了
用日期來分檔名
 樓主| 發表於 2020-1-2 12:09:13 | 顯示全部樓層
本帖最後由 start1119 於 2020-1-2 12:57 編輯

[Bash shell] 純文本查看 復制代碼
for %a run (%Counter% 1%Counter%)


我在關機那加上

[Bash shell] 純文本查看 復制代碼
stall 3000000
if "%Counter%" le "10" then
   reset 
else 
   reset -s
endif


[Bash shell] 純文本查看 復制代碼
for %a run (%Counter% 1%Counter%)

次數能在前code 設定?
發表於 2020-1-2 13:29:16 | 顯示全部樓層
本帖最後由 阿達金田一 於 2020-1-2 13:30 編輯
start1119 發表於 2020-1-2 10:05
恩 確實是 重開機沒有進入fs0: 的問題
但是跑了

%b: 這是在 for 中才能使用...這不是 環境變數
而是 for 指令的 傳遞變數
不過主要要看 shell 本身的 變數 的處理

老實說感覺 uefi shell 的 bat 很指令很兩光...
例如
我第1個 for
for %a run (%Counter% 1%Counter%)

然後 第2個 for 我一開始是寫成
for %a in fs0 fs1 fs2 fs3 blk0 blk1 blk2 blk3
然後會出包...一直和我說 var 不合法...然後值是 %a 的值
這裡推測是 第1個 for %a 後...之後的 %a 都當成 變數值 在用
也就是 第1個 for 後...假設 %a 是 5
第2個 for 在執行時會等於是
for 5 in fs0 fs1 fs2 fs3 blk0 blk1 blk2 blk3
所以會出錯....改成
for %b in fs0 fs1 fs2 fs3 blk0 blk1 blk2 blk3
才能正常跑

老實說我覺的這可以算 shell 的 bug
因為比較理合的處理應該要是 %a 只做用在 for  ... endfor

當然因為 各個 uefil shell 可能都不同
會有各體差異...所以要看實際情況
例如 ... for %a run (start end step)
有的 start 可以是 0
for %a run (0 999)
%a 會正常由 0 1 2 3 ... 999
但有的 shell 最小只能從 1 開始 (vbox 的 uefil shell 就是這樣)
像上例 for %a run (0 999)
vbox 的 uefi shell 2.1 ... %a 就直接給 999
(推測 vbox 的 uefil shell 2.1 問題很多...)

for %b in fs0 fs1 fs2 fs3 blk0 blk1 blk2 blk3
我 vbox  測是可以的...
所以不行就是要看你那 實機 或 uefi shell 情況
基本上自己加 echo %b 或 pause 之類的去測指令 哪有執行哪沒執行
[Bash shell] 純文本查看 復制代碼
for %b in fs0 fs1 fs2 fs3 blk0 blk1 blk2 blk3
    echo %b
    if exist %b:\startup.nsh then
       echo %b:\startup.nsh
       %b:
       cd\
       goto Leave_For2
    endif
endfor
:Leave_For2


 樓主| 發表於 2020-1-2 14:09:37 | 顯示全部樓層
阿達金田一 發表於 2020-1-2 13:29
%b: 這是在 for 中才能使用...這不是 環境變數
而是 for 指令的 傳遞變數
不過主要要看 shell 本身的 變數 ...



感謝大大 協助!
發表於 2020-1-2 14:38:12 | 顯示全部樓層
start1119 發表於 2020-1-2 10:52
另外檔名可能用 time 值名命嗎?
將多筆存入同一文件
突然覺得用Counter檔案似乎太多了

可以但要另外寫 .nsh 去處理 time
但你應該是要 date ...
因為 time 也是一直在變...
 樓主| 發表於 2020-1-2 14:50:18 | 顯示全部樓層
阿達金田一 發表於 2020-1-2 14:38
可以但要另外寫 .nsh 去處理 time
但你應該是要 date ...
因為 time 也是一直在變... ...

對是 date
我後來是打算
[Bash shell] 純文本查看 復制代碼
cp test.txt test1.%counter%.txt
#這樣區分
#若日期 
cp test.txt test1.%date%.txt
#會空白 test1..txt
發表於 2020-1-2 14:54:32 | 顯示全部樓層

關於 Counter

我最新的寫法是

先判斷 %Counter% 是不是一個 整數(int)
所以如果 Counter 不存在 或 不是整數...都會 set Counter 1

然後
for %a run (%Counter% 1%Counter%)
這個只是用來 Counter + 1 而以
簡單說他的方法就是
假設 Counter = 5
for %a run (%Counter% 1%Counter%)
for %a run (5 15)
%a 會是 5 6 7 .... 15
也就是 6 的時候... set Counter %a ...然後 離開 for
這裡我是有一個比較簡易的判斷
首先 for loop 第1次 %a 會等於 %Counter%
因為 %a 初始就是 %Counter%
然後 loop 第2次就是 +1 ... 所以第2次就 Leave For
所以我用 if %Counter% ne %a then ...
因為第2次 %a 就不等於 %Counter% 了

而後面
if %Counter% lt 1 then
   set Counter 1
endif

只是一個保險動作...基本上不會遇到
for run 的 start end 數值有問題時 for %a 會給 -1
所以用 if %Counter% lt 1 then
判斷 Counter 是否正常

整段 Counter code 自己看想要加在哪裡
發表於 2020-1-2 15:50:09 | 顯示全部樓層
本帖最後由 阿達金田一 於 2020-1-2 17:50 編輯
start1119 發表於 2020-1-2 14:50
對是 date
我後來是打算

建立一個 set.txt ...用 unicode
set %1

注意 %1 後面還有一個空格

這裡我發現 > 和 >> 好像用 UNICODE 比較不會出問題
如果 >> 時...outfile 是 ASCII 有時就會無法寫入

然後 set date 看新加的 # set date 那段

比較費工...基本上 copy 一份 set.txt 為 set-tmp.nsh
然後 set-tmp.nsh 檔案的產生日期...正常應該是 copy 時 的 日期時間
用 ls -sfo 輸出 格式檔 ... set-tmp.sfo
再用 parse 取出 set-tmp.sfo 中的 date資料 追加寫入到 set-tmp.nsh 後面
然後用 set-tmp.nsh date 去 set date
會用 sfo 是因為
date 指令...的格式是 01/01/2020
檔名不能有 /
而 sfo 格式 是 01.01.2020

[Bash shell] 純文本查看 復制代碼
@echo -off

# Set Startup delay time for 0 sec
set StartupDelay 0

# Check Counter
if not IsInt(%Counter%) then
   set Counter 1
   goto Leave_For1
endif
for %a run (%Counter% 1%Counter%)
    if %Counter% ne %a then
       set Counter %a
       goto Leave_For1
    endif
endfor
:Leave_For1
if %Counter% lt 1 then
   set Counter 1
endif 

# Check and cd startup.nsh path
for %b in fs0 fs1 fs2 fs3 blk0 blk1 blk2 blk3
    if exist %b:\startup.nsh then
       %b:
       cd\
       goto Leave_For2
    endif
endfor
:Leave_For2

# set date
cp set.txt set-tmp.nsh > NUL
ls -sfo set-tmp.nsh >> set-tmp.sfo
parse set-tmp.sfo FileInfo 7 -i 1 >> set-tmp.nsh
set-tmp.nsh date
del set-tmp.sfo > NUL
del set-tmp.nsh > NUL

# Set Log File
set Log startup.nsh.%date%.log

echo =========== >> %Log%
echo Boot Coutner = %Counter%
echo Boot Coutner = %Counter% >> %Log%
echo Current Working Directory = %cwd%
echo Current Working Directory = %cwd% >> %Log%
date >> %Log%
time >> %Log%
echo " " >> %Log%
echo === PCI === >> %Log%
pci >> %Log%
echo " " >> %Log%

#Wait for 3 sec then system warm reboot
stall 3000000
reset -w


另外如果
# Check and cd startup.nsh path
那段真的搞不定
其實一行一行分開寫也是可以啦...用 for 只是比較精簡
[Bash shell] 純文本查看 復制代碼
if exist fs0:\startup.nsh then
fs0:
goto Leave_For2
endif
if exist fs1:\startup.nsh then
fs1:
goto Leave_For2
endif
if exist fs2:\startup.nsh then
fs2:
goto Leave_For2
endif

:Leave_For2
cd\


您需要登錄後才可以回帖 登錄 | 我要註冊

本版積分規則

小黑屋|手機版|NoName Team 電腦資訊討論區 |網站地圖

GMT+8, 2020-4-1 01:32 , Processed in 0.089209 second(s), 14 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回復 返回頂部 返回列表