查看單個文章
舊 2014-08-12, 03:24 PM   #9 (permalink)
getter
管理員
 
getter 的頭像
榮譽勳章
UID - 6433
在線等級: 級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時
註冊日期: 2002-12-08
住址: 天線星球
文章: 8157
精華: 0
現金: 19955 金幣
資產: 765391 金幣
預設

寫批次檔的方式,老實說也有點麻煩 ...

如果改天忘了為何會這樣寫 ... 也要花點時間還回憶 ... 挺累的 ...

因此迪西建議 ... 買一套比較省事、簡單 ...

如果說覺得不怕麻煩 ... 就可以看下去 ...

說不定還會看不懂 ...

-----------------------------------------------------
至於批次檔 ... 迪西有寫教學 ...

不過得要耐著性子看完 ...

批次檔編程概念 ... ...

1.跟基本程式設計差不多,只是要弄懂批次檔專用指令用法而已。
2.需要做試跑,因為某些地方很怪異。
3.某些以正式的程式社概念的邏輯可行,批次檔則不行會變得很奇怪。
4.建議可以使用 Notepad++ 這套文字編輯器,有支援批次檔的高亮語法顯示。
編寫起來才不會看到脫窗。

以下是迪西對這次的主題:寫的簡易批次檔
-------------------------------------------------------------------------
for %%i in (*.dnw) do (echo "%%i")

for %%i in (*.dnw) do (start /wait "" "%%i")


指令解說:
%%i:for Loop 的傳遞變數。

in:%%i 的來源。是 in 後面的 () 裡指的東西。本次為 *.dnw。
相當於程式設計的 for (i=0; i=i+1; i<=10) 的部份。

do:%%i 傳送到給文字命令使用的變數字串。是 do 後面的 () 裡指的東西。
本次為 start /wait "" "%%i"。相當於程式設計的 for ( --- ) {}的部份最後面 {}
的命令執行部份。

以 for 來說 %i 與 %%i 兩者都是用來傳遞變處用途的。差異在於,當是在 CMD 中鍵
入命令語法時並執行時,只能用 %i 用 %%i 時會出錯。相對的 %%i 則是使用在
*.bat/*.cmd 的批次檔中的變數語法。也就是在 cmd 視窗下 for 要用 %i 才會正常。
但是在 *.bat/*.cmd 的批次檔中,for 要用 %%i 才會正常。為何? 迪西也不知道。


for %%i in (*.dnw) do (echo "%%i") 執行時的動作解說:
執行時 for Loop 會依據 (*.dnw) 的描述,去找尋與批次檔放在一起或是目前 CMD
工作視窗位置的 *.dnw 檔案。並把找到的檔案,連同存在位置+完整檔名傳送到後面
的 do () 裡面。直到找完所有的 *.dnw 檔案為止,並結束執行。


echo 這個指令是把 %%i 顯示出來,就會架設顯示如: "D:\xxx\123.dnw" 的訊息。
受限於 cmd 的特性,若不把 %%i 用 "" 框起來。當存在位置有空格時,如 D:\xx xx\123.dnw 時,
cmd 會解讀成兩個段落的命令參數來傳定,如 D:\xx 跟 xx\123.dnw,因此執行上就
容易出錯。雖然以 echo 只是顯示出來,是沒有感覺到不同。但是給其他的執行命令就
會有問題。會變成只看到 D:\xx 而看不到 xx\123.dnw 就找不到檔案。


因此接著解說 for %%i in (*.dnw) do (start /wait "" "%%i") 就很清楚了
start /wait "":
start 是告訴 cmd 命令執行器執行後面 "%%i" 中描述的檔案。
/wait 則表示等待目前的執行的檔案執行結束,離來 start 的動作。當沒有 /wait
時,就會一口氣把 "%%i" 的檔案全部開啟執行。這樣會有一個問題,當這些檔案有
依序執行的必要(是一個一接個,而不是全部幾乎同時開啟時),就會有大麻煩。如更
新檔就是這類的時後,/wait 就得要使用了。
"" 是顯示工作視窗的抬頭標題,一般若不打算顯示,建議就是 "" 就好了。因為省略
的話,有時後會讓 start 搞不清楚是要執行的檔案還是顯示工作視窗的抬頭標題。
執行上因此出錯。


以本樓主題來說,要一次匯入完所有的字典更新,理論上是
for %%i in (*.dnw) do (start /wait "" "%%i") 命令存用記事本檔成
如 updnw.bat 或是 updnw.cmd 皆可,但只能事 ansi 格式,不可以事
Unicode 格式。

跟 *.dnw 檔案放在一起。在執行就好了 updnw 批次檔就好 。


-----------------------------------------------------------------------------

感覺好像很複雜,有比較簡單的的方法建立批次檔嗎?

就是用 cmd,新進入到有 *.dnw 的資料夾下,鍵入 dir /b *.dnw > list.txt

產生一個檔案清單 ... 內如類似大約會如下:
2002q3.dnw
2002q4.dnw
... ...
... ...
2010q3.dnw
2010q4.dnw

卻認好後,把 list.txt 清單另存成 updnw.bat 或是 updnw.cmd
再去執行 updnw.bat 或是 updnw.cmd,也許會自動帶入,但是
也可能發生一次如上述一次開啟全部檔案的狀況,導致更新失敗。
就只好辛苦的在 如 2010q4.dnw 前面加入 start /wait "",
變成 start /wait "" 2010q4.dnw。 變成是每一行都要加,如下

start /wait "" 2002q3.dnw
start /wait "" 2002q4.dnw
start /wait "" ... ...
start /wait "" ... ...
start /wait "" 2010q3.dnw
start /wait "" 2010q4.dnw

用這種清單的方式,編寫上或許比較簡單,但是檔越多改起來就越累,
當檔案有增加或是減少時,就要重新製作一次更新用的清單批次檔。

用那個 for 的比較簡單,讓 for 自己去自動找尋檔案比較輕鬆。

-------------------------------------------------------------------------

不管哪一種方式寫批次檔執行檔案,比較麻煩事 *.dnw 的問題。當初使以

*.exe 或是 *.msi 這類的可執行檔案,為對象的。

當 Windows 檔案關聯可以透過點兩下自動執行,因此理論上可行,實務

上還是要測試過比較保險。可行的話,就是撿到了。

最簡單的測試方式,就是先用 cmd 視窗,在工作位置下 dir *.dnw 可以列出

的位置,直接鍵入某個 .dnw 按下 [Enter] 看看有沒有反應,有正常的更新動作

表示有相當成功的機會。接著在測試 start /wait "" 某一個.dnw 看看是否也是

一樣,可以就表示。那個批次檔語法有相當機會可以成立並使用。

此帖於 2014-08-12 04:00 PM 被 getter 編輯.
__________________
在「專業主討論區」中的問題解決後,要記得按一下 http://forum.slime.com.tw/images/stamps/is_solved.gif 按鈕喔,
這是一種禮貌動作。

一樣是在「專業主討論區」中發問,不管問題解決與否,都要回應別人的回答文喔。
不然搞 [斷頭文],只看不回應,下次被別人列入黑名單就不要怪人喔。

天線寶寶說再見啦~ ... 天線寶寶說再見啦~

迪西:「再見~ 再見~」

Otaku Culture Party 關心您 ...
getter 目前離線  
送花文章: 37855, 收花文章: 6441 篇, 收花: 26048 次
回覆時引用此帖
有 2 位會員向 getter 送花:
a471 (2014-08-12),grc45 (2014-08-12)
感謝您發表一篇好文章