|
論壇說明 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
|
主題工具 | 顯示模式 |
2013-10-30, 09:58 AM | #1 |
註冊會員
|
求助 - 批次新增資料夾與子資料夾
請問各位先進,我最近在幫公司做資料管理
需要一次建立大量的資料夾,而我之前有在論壇搜尋到相關的討論內容 整理了一下 寫出以下批次檔 但是有個問題,就是資料夾我在新增的時候,可能只需要某段編號 例如資料夾開頭為10- 編號可能是 3001~4115(4碼) 10-3001~10-4115 或者 開頭是1400- 編號是 200~311(3碼) 1400-200~1400-311 這要如何修改? 請各位先進指導 謝謝!! 語法:
set num= set name= cls echo. echo 請輸入資料夾名稱: set /p name= echo. echo. echo 請輸入資料夾數量 100~9999 個: set /p num= for /L %%V in (1,1,99) do ( cls IF %%V LSS 10 (mkdir %name%000%%V\開發\CAD) IF %%V LSS 10 (mkdir %name%000%%V\開發\PPAP) IF %%V LSS 10 (mkdir %name%000%%V\開發\成本) IF %%V LSS 10 (mkdir %name%000%%V\開發\成績表) IF %%V LSS 10 (mkdir %name%000%%V\開發\異常) IF %%V LSS 10 (mkdir %name%000%%V\品管\客訴) IF %%V LSS 10 (mkdir %name%000%%V\品管\不良品統計) IF %%V LSS 10 (mkdir %name%000%%V\品管\品質異常處理) IF %%V LSS 10 (mkdir %name%000%%V\品管\圖片及CP) IF %%V LSS 10 (mkdir %name%000%%V\品管\進料) IF %%V LSS 10 (mkdir %name%000%%V\品管\出貨) IF %%V LSS 10 (mkdir %name%000%%V\品管\量測資料) IF %%V LSS 10 (mkdir %name%000%%V\品管\特採申請) IF %%V LSS 10 (mkdir %name%000%%V\品管\產品定期稽核) IF %%V LSS 10 (mkdir %name%000%%V\品管\CPKPPK) IF %%V LSS 10 (mkdir %name%000%%V\品管\配合廠商) IF %%V LSS 10 (mkdir %name%000%%V\車床\SOP) IF %%V LSS 10 (mkdir %name%000%%V\車床\機台程式) IF %%V LSS 10 (mkdir %name%000%%V\銑床\SOP) IF %%V LSS 10 (mkdir %name%000%%V\銑床\機台程式) IF %%V LSS 10 (mkdir %name%000%%V\後加工\SOP) IF %%V GEQ 10 (mkdir %name%00%%V\開發\CAD) IF %%V GEQ 10 (mkdir %name%00%%V\開發\PPAP) IF %%V GEQ 10 (mkdir %name%00%%V\開發\成本) IF %%V GEQ 10 (mkdir %name%00%%V\開發\成績表) IF %%V GEQ 10 (mkdir %name%00%%V\開發\異常) IF %%V GEQ 10 (mkdir %name%00%%V\品管\客訴) IF %%V GEQ 10 (mkdir %name%00%%V\品管\不良品統計) IF %%V GEQ 10 (mkdir %name%00%%V\品管\品質異常處理) IF %%V GEQ 10 (mkdir %name%00%%V\品管\圖片及CP) IF %%V GEQ 10 (mkdir %name%00%%V\品管\進料) IF %%V GEQ 10 (mkdir %name%00%%V\品管\出貨) IF %%V GEQ 10 (mkdir %name%00%%V\品管\量測資料) IF %%V GEQ 10 (mkdir %name%00%%V\品管\特採申請) IF %%V GEQ 10 (mkdir %name%00%%V\品管\產品定期稽核) IF %%V GEQ 10 (mkdir %name%00%%V\品管\CPKPPK) IF %%V GEQ 10 (mkdir %name%00%%V\品管\配合廠商) IF %%V GEQ 10 (mkdir %name%00%%V\車床\SOP) IF %%V GEQ 10 (mkdir %name%00%%V\車床\機台程式) IF %%V GEQ 10 (mkdir %name%00%%V\銑床\SOP) IF %%V GEQ 10 (mkdir %name%00%%V\銑床\機台程式) IF %%V GEQ 10 (mkdir %name%00%%V\後加工\SOP) ) for /L %%V in (100,1,%num%) do ( cls IF %%V LSS 1000 (mkdir %name%0%%V\開發\CAD) IF %%V LSS 1000 (mkdir %name%0%%V\開發\PPAP) IF %%V LSS 1000 (mkdir %name%0%%V\開發\成本) IF %%V LSS 1000 (mkdir %name%0%%V\開發\成績表) IF %%V LSS 1000 (mkdir %name%0%%V\開發\異常) IF %%V LSS 1000 (mkdir %name%0%%V\品管\客訴) IF %%V LSS 1000 (mkdir %name%0%%V\品管\不良品統計) IF %%V LSS 1000 (mkdir %name%0%%V\品管\品質異常處理) IF %%V LSS 1000 (mkdir %name%0%%V\品管\圖片及CP) IF %%V LSS 1000 (mkdir %name%0%%V\品管\進料) IF %%V LSS 1000 (mkdir %name%0%%V\品管\出貨) IF %%V LSS 1000 (mkdir %name%0%%V\品管\量測資料) IF %%V LSS 1000 (mkdir %name%0%%V\品管\特採申請) IF %%V LSS 1000 (mkdir %name%0%%V\品管\產品定期稽核) IF %%V LSS 1000 (mkdir %name%0%%V\品管\CPKPPK) IF %%V LSS 1000 (mkdir %name%0%%V\品管\配合廠商) IF %%V LSS 1000 (mkdir %name%0%%V\車床\SOP) IF %%V LSS 1000 (mkdir %name%0%%V\車床\機台程式) IF %%V LSS 1000 (mkdir %name%0%%V\銑床\SOP) IF %%V LSS 1000 (mkdir %name%0%%V\銑床\機台程式) IF %%V LSS 1000 (mkdir %name%0%%V\後加工\SOP) IF %%V GEQ 1000 (mkdir %name%%%V\開發\CAD) IF %%V GEQ 1000 (mkdir %name%%%V\開發\PPAP) IF %%V GEQ 1000 (mkdir %name%%%V\開發\成本) IF %%V GEQ 1000 (mkdir %name%%%V\開發\成績表) IF %%V GEQ 1000 (mkdir %name%%%V\開發\異常) IF %%V GEQ 1000 (mkdir %name%%%V\品管\客訴) IF %%V GEQ 1000 (mkdir %name%%%V\品管\不良品統計) IF %%V GEQ 1000 (mkdir %name%%%V\品管\品質異常處理) IF %%V GEQ 1000 (mkdir %name%%%V\品管\圖片及CP) IF %%V GEQ 1000 (mkdir %name%%%V\品管\進料) IF %%V GEQ 1000 (mkdir %name%%%V\品管\出貨) IF %%V GEQ 1000 (mkdir %name%%%V\品管\量測資料) IF %%V GEQ 1000 (mkdir %name%%%V\品管\特採申請) IF %%V GEQ 1000 (mkdir %name%%%V\品管\產品定期稽核) IF %%V GEQ 1000 (mkdir %name%%%V\品管\CPKPPK) IF %%V GEQ 1000 (mkdir %name%%%V\品管\配合廠商) IF %%V GEQ 1000 (mkdir %name%%%V\車床\SOP) IF %%V GEQ 1000 (mkdir %name%%%V\車床\機台程式) IF %%V GEQ 1000 (mkdir %name%%%V\銑床\SOP) IF %%V GEQ 1000 (mkdir %name%%%V\銑床\機台程式) IF %%V GEQ 1000 (mkdir %name%%%V\後加工\SOP) ) |
送花文章: 0,
|
2013-10-30, 11:21 PM | #2 (permalink) |
管理員
|
這樣是不行的 因為沒有充分利用變量 ... 也就是變數
有些變數也可能有設定錯誤或是 IF 或 FOR 的使用錯誤? 視情況相同條件的 IF 一個就夠了,如 語法:
IF %%V LSS 10 ( mkdir %name%000%%V\開發\CAD mkdir %name%000%%V\開發\PPAP mkdir %name%000%%V\開發\成本 mkdir %name%000%%V\開發\成績表 mkdir %name%000%%V\開發\異常 mkdir %name%000%%V\品管\客訴 mkdir %name%000%%V\品管\不良品統計 mkdir %name%000%%V\品管\品質異常處理 mkdir %name%000%%V\品管\圖片及CP mkdir %name%000%%V\品管\進料 mkdir %name%000%%V\品管\出貨 mkdir %name%000%%V\品管\量測資料 mkdir %name%000%%V\品管\特採申請 mkdir %name%000%%V\品管\產品定期稽核 mkdir %name%000%%V\品管\CPKPPK mkdir %name%000%%V\品管\配合廠商 mkdir %name%000%%V\車床\SOP mkdir %name%000%%V\車床\機台程式 mkdir %name%000%%V\銑床\SOP mkdir %name%000%%V\銑床\機台程式 mkdir %name%000%%V\後加工\SOP ) 如果說 很多條件的 IF 內可使用的命令內容是一樣的話或多行相同的部分,可以改成片段呼叫或批次檔呼叫的方式。 這樣就可以把很多重複的部份可簡化掉了,日後若要小改一些地方也不會說改到吐血 語法:
for /L %%V in (1,1,99) do ( IF %%V LSS 10 (call :Make_Dirs %name%000%%V) IF %%V GEQ 10 (call :Make_Dirs %name%00%%V) ) for /L %%V in (100,1,%num%) do ( IF %%V LSS 1000 (call :Make_Dirs %name%0%%V) IF %%V GEQ 1000 (call :Make_Dirs %name%%%V) ) goto :eof :Make_Dirs ::片段開頭的標籤 mkdir %1\開發\CAD mkdir %1\開發\PPAP mkdir %1V\開發\成本 mkdir %1\開發\成績表 mkdir %1\開發\異常 mkdir %1\品管\客訴 mkdir %1\品管\不良品統計 mkdir %1\品管\品質異常處理 mkdir %1\品管\圖片及CP mkdir %1\品管\進料 mkdir %1\品管\出貨 mkdir %1\品管\量測資料 mkdir %1\品管\特採申請 mkdir %1\品管\產品定期稽核 mkdir %1\品管\CPKPPK mkdir %1\品管\配合廠商 mkdir %1\車床\SOP mkdir %1\車床\機台程式 mkdir %1\銑床\SOP mkdir %1\銑床\機台程式 mkdir %1\後加工\SOP goto :eof ::片段結尾,到這裡會離開這個片段 :eof 正確意思是代表該批次檔的結尾,不管前面執行了幾行,後面還有多少行,只要看到 goto :eof 表示後面的其他行的命令敘述不用做了。 那這能幹麼?搭配 『 :標籤名稱 』的標籤的語法一起使用時,批次檔中使用了 Call 語法時,這的 『 :標籤名稱 ~ goto :eof 』這一段的命令 集合就相當於程式設計中的 [副程式] 了,為了必免一般執行時,會被錯誤執行,因此會在『 :標籤名稱 』前面放一個goto :eof ,也就是 『 goto :eof :標籤名稱 ~ goto :eof 』的樣式,來使其完全獨立,若是這個片段需要至少被執行一此的話,或是某種排列執行的需要時,:標籤名稱 的 goto :eof 就可以省略不用。上述的範例中 :Make_Dirs 為了把相同的 mkdir %1%2\後加工\SOP 給予重複利用。又希望平常時不要被錯誤執行 因此就會如上述這樣了 goto :eof :Make_Dirs ...... 多行的命令內容 ...... goto :eof 但是這個批次檔到目前為止,只是單純從 1 開始建立起,並無法以指定範圍說來建立資料夾了 ... 因此要改過 ... 要設定一個『值域』的範圍,再讓 FOR 去跑就好了。 1,1,99 表示 從 1 開始,每次進 1,到 99結束 如此 FOR 裡面的 1 跟 99 要改成指定變數,如 NumStart,1,NumEnd,最前面再去增加兩個 Set /P 去接收 NumStart、NumEnd 的資料就以做到 值範圍變動了。 如 name 後面的那些國字是固定的嗎? 可以利用 FOR 讀取存文字檔,一次一行讀入來處理 正確說來要先卻確定『資料夾名稱格式』才能把 程式寫好,批次檔也是一樣 ... 如『名稱+數字/單位名稱/ 表格名稱』... 名稱+數字 的部份是可以隨需要變動,單位名稱、表格名稱則不能變更 / 表示每個『子』資料夾的層級 ... 如此拆解的3~4個程式部份,老實說迪西很懶惰懶得打 ... 1.可變部份程式的資料夾命名程式碼。如 1400-200~1400-311 或者是 10-3001~10-4115 2.數值變動範圍的設定與規格化。AAAA-BBB~AAAA-DDD 或者是 AA-BBBB~AA-CCCC 3.固定部份的程式碼。 MD 品管\產品定期稽核,好幾行。或是一個自解檔打包好。 4.資料輸入的方式。最前面的 set /p 的部份 要幾組輸入,如何顯示。 第 3 個部份最簡單,如果說確定是如此固定了,可以先寫一個簡單的批次檔先固定好, 由供其他的批次檔呼叫使用就好了,這樣就可以少很多。或者是,先土法煉鋼,把這個 固定部份的資料夾建立好,再用 WinRAR 壓縮起來,製作成為一個『自我解壓縮檔』, 供其他的批次檔呼叫使用。 這樣如個『 車床\SOP 』的部份那一大堆就解決了。 其他等迪西想到在說 ... 其實寫到這裡就表示出了這個功能可以用 簡單 C/C++ 語言 (DEV-C) 去寫 也可以用 VBA 、VB Script 來實踐,因為批次檔本身會有一種處理的缺陷 問題 ... 批次檔的問題: 1.會挑剔 Windwos CMD 的版本,同樣的批次檔,在 XP 或 Win7 中執行的 結果會可能會不一樣,或是 XP 可以跑,到了 Win7 下就不能用了。 2.語法辨識的問題,照一般的程式邏輯時,程式碼極少或簡單的時候,通常是 對的,但是稍微使用些所謂的『巢狀』結構的時候。就會出現莫名其妙的錯誤。 因此有時候就要使用稍微不太正常(不符合常見的程式邏輯的方法)的方式來處 理。 --------------------------------------------------------------------- 如果不想寫這些東西,其實也有類似的程式可以用,如 Folder Frenzy、Text 2 Folders 這兩個程式的原理很簡單,先準備好一個純文字文件的,資料夾名稱的清單,再把清單餵給 Folder Frenzy、Text 2 Folders 去產生資料夾就好了。 如果說這樣就可以輕鬆的用,就可以不用那麼痛苦的寫批次檔了。 Folder Frenzy http://briian.com/?p=7095 http://123.briian.com/forum.php?mod=...OTJ8MHwxMDg%3D Text 2 Folders http://www.soft4fun.net/how-to/%E6%8...-2-folders.htm 此帖於 2013-10-31 05:57 AM 被 getter 編輯. |
__________________ 在「專業主討論區」中的問題解決後,要記得按一下 按鈕喔, 這是一種禮貌動作。 一樣是在「專業主討論區」中發問,不管問題解決與否,都要回應別人的回答文喔。 不然搞 [斷頭文],只看不回應,下次被別人列入黑名單就不要怪人喔。 天線寶寶說再見啦~ ... 天線寶寶說再見啦~ 迪西:「再見~ 再見~」 『 Otaku Culture Party 』 關心您 ... |
|
送花文章: 37855,
|
2013-10-31, 05:35 AM | #3 (permalink) |
管理員
|
若是依照迪西想的那種資料夾結構 ... 批次檔不用寫的這麼囉說 說不定連 for 也用不到
1.先建立一個 AA-bbb~AA-ccc 的資料夾。 2.再 AA-bbb~AA-ccc 的資料夾裡面,再建立上述的一對子資料夾。 若是這樣的話 ... 解決的方案一:如同迪西之前說的 使用 WinRAR 解決 1.建立一個上述條兩個條件的範本空資料夾。 2.用 WinRAR 打包成一個資料夾。 3.用 WinRAR 再轉成一個自我解壓縮檔,有沒有設定成安靜模式解壓說縮都可以。 日後要用的話,就點擊這個自我解壓縮檔,自動解壓縮就完成的同時,這個一堆大量的資料夾也就 好了。這時只要再去改一下 AA-bbb~AA-ccc 資料夾的名稱就好了。 解決的方案二:使用 Folder Frenzy 或Text 2 Folders 1.平常先建立好字典檔。 2.再使用該程式產生。 3.有不對的地方再自行修改。 解決的方案三:寫個簡易批次檔、VB Script 來用 語法:
@Echo off cls md AA-bbbb~AA-cccc cd AA-bbbb~AA-cccc md 開發\CAD md 開發\PPAP md 開發\成本 md 開發\成績表 md 開發\異常 md 品管\客訴 md 品管\不良品統計 md 品管\品質異常處理 md 品管\圖片及CP md 品管\進料 md 品管\出貨 md 品管\量測資料 md 品管\特採申請 md 品管\產品定期稽核 md 品管\CPKPPK md 品管\配合廠商 md 車床\SOP md 車床\機台程式 md 銑床\SOP md 銑床\機台程式 md 後加工\SOP cd.. 2.手動把 AA-bbbb~AA-cccc 的資料夾名稱改成想要的就可以了。 |
送花文章: 37855,
+20 金幣
|
2013-10-31, 12:02 PM | #4 (permalink) |
註冊會員
|
謝謝 getter 指教!
我參考您跟朋友改的範例,再次改寫 語法:
set num1= set num2= set name= cls echo. %titles% echo. echo 請輸入資料夾名稱: set /p name= echo. echo. echo 請輸入開始編號(1~9999): set /p num1= echo 請輸入結束編號(1~9999): set /p num2= if %%V LSS 10 (goto run1) if %%V GEQ 10 LEQ 99 (goto run2) if %%V GEQ 100 LEQ 999 (goto run3) if %%V GEQ 1000 LEQ 9999 (goto run4) cls :run1 for /L %%V in (%num1%,1,%num2%) do ( IF %%V LSS 10 (call:Make_Dirs %name%000%%V) ) :run2 for /L %%V in (%num1%,1,%num2%) do ( IF %%V GEQ 10 IF %%V LEQ 99 (call:Make_Dirs %name%00%%V) ) :run3 for /L %%V in (%num1%,1,%num2%) do ( IF %%V GEQ 100 IF %%V LEQ 999 (call:Make_Dirs %name%0%%V) ) :run4 for /L %%V in (%num1%,1,%num2%) do ( IF %%V GEQ 1000 IF %%V LEQ 9999 (call:Make_Dirs %name%%%V) ) goto :eof :Make_Dirs mkdir %1\開發\CAD mkdir %1\開發\PPAP mkdir %1\開發\成本 mkdir %1\開發\成績表 mkdir %1\開發\異常 mkdir %1\品管\客訴 mkdir %1\品管\不良品統計 mkdir %1\品管\品質異常處理 mkdir %1\品管\圖片及CP mkdir %1\品管\進料 mkdir %1\品管\出貨 mkdir %1\品管\量測資料 mkdir %1\品管\特採申請 mkdir %1\品管\產品定期稽核 mkdir %1\品管\CPKPPK mkdir %1\品管\配合廠商 mkdir %1\車床\SOP mkdir %1\車床\機台程式 mkdir %1\銑床\SOP mkdir %1\銑床\機台程式 mkdir %1\後加工\SOP goto :eof |
送花文章: 0,
|
2013-10-31, 12:11 PM | #5 (permalink) | |
註冊會員
|
引用:
txt必須把第一層資料夾也寫進去 我建立的資料夾一次幾乎都破千個 這樣就等於一次要寫好幾千筆資料了 |
|
送花文章: 0,
|
2013-10-31, 04:35 PM | #6 (permalink) | |
管理員
|
引用:
此外也可以利用 for /F 的強化指令去作字典檔的模式來作建立資料夾的控制 ... 基本上已經有一個地方有作 IF check 的話就不用去作第二次的 IF check 可以再幾個地方多些檢驗的機制 語法:
@echo off :ReKeyIn set num1=bbbb set num2=cccc set name=AA call :Dirs set /p "name=請輸入資料夾名稱: " :ReNum1 set num1=bbbb call :Dirs set /p "num1=請輸入開始編號(1~9999): " set /a num1=%num1% if %num1% EQU bbbb ( echo.& echo.開始編號輸入為 0 錯誤,請重新輸入。 echo.& Pause & goto :ReNum1 ) if %num1% LSS 1 ( echo.& echo.開始編號輸入為 0 錯誤,請重新輸入。 echo.& Pause & goto :ReNum1 ) :ReNum2 set num2=cccc call :Dirs set /p "num2=請輸入結束編號(1~9999): " set /a num2=%num2% if %num2% EQU cccc ( echo.& echo.結束編號輸入為 0 錯誤,請重新輸入。 echo.& Pause & goto :ReNum2 ) if %num2% LSS 1 ( echo.& echo.結束編號輸入為 0 錯誤,請重新輸入。 echo.& Pause & goto :ReNum2 ) if %num1% GEQ %num2% ( echo.& echo.結束編號>=開始編號的錯誤,請重新輸入。 echo.& Pause & goto :ReNum2 ) call :Dirs set /p "YesNo=請確認資料夾名稱(正確輸入 Y,錯誤要重新輸入者輸入 N): " if /i %YesNo% == N (goto :ReKeyIn) if %num2% LSS 10 (goto run1) if %num2% GEQ 10 if %num2% LSS 100 (goto run2) if %num2% GEQ 100 if %num2% LSS 1000 (goto run3) if %num2% GEQ 1000 if %num2% LSS 10000 (goto run4) goto :eof :run1 for /L %%V in (%num1%,1,%num2%) do ( cls echo.建立資料夾: %name%-000%%V call:Make_Dirs %name%-000%%V ) goto :eof :run2 for /L %%V in (%num1%,1,%num2%) do ( cls echo.建立資料夾: %name%-00%%V call:Make_Dirs %name%-00%%V ) goto :eof :run3 for /L %%V in (%num1%,1,%num2%) do ( cls echo.建立資料夾: %name%-0%%V call:Make_Dirs %name%-0%%V ) goto :eof :run4 for /L %%V in (%num1%,1,%num2%) do ( cls echo.建立資料夾: %name%-%%V call:Make_Dirs %name%-%%V ) goto :eof :Dirs cls echo. if %num1% EQU bbbb if %num2% EQU cccc (echo.目標主資料名稱: "%name%-%num1%"~"%name%-%num2%") if %num1% LSS 10 if %num2% EQU cccc (echo.目標主資料名稱: "%name%-000%num1%"~"%name%-%num2%") else (echo.目標主資料名稱: "%name%-000%num1%"~"%name%-000%num2%") if %num1% GEQ 10 if %num1% LSS 100 if %num2% EQU cccc (echo.目標主資料名稱: "%name%-00%num1%"~"%name%-%num2%") else (echo.目標主資料名稱: "%name%-00%num1%"~"%name%-00%num2%") if %num1% GEQ 100 if %num1% LSS 1000 if %num2% EQU cccc (echo.目標主資料名稱: "%name%-0%num1%"~"%name%-%num2%") else (echo.目標主資料名稱: "%name%-0%num1%"~"%name%-0%num2%") if %num1% GEQ 1000 if %num1% LSS 10000 (echo.目標主資料名稱: "%name%-%num1%"~"%name%-%num2%") echo. goto :eof :Make_Dirs mkdir %1\開發\CAD mkdir %1\開發\PPAP mkdir %1\開發\成本 mkdir %1\開發\成績表 mkdir %1\開發\異常 mkdir %1\品管\客訴 mkdir %1\品管\不良品統計 mkdir %1\品管\品質異常處理 mkdir %1\品管\圖片及CP mkdir %1\品管\進料 mkdir %1\品管\出貨 mkdir %1\品管\量測資料 mkdir %1\品管\特採申請 mkdir %1\品管\產品定期稽核 mkdir %1\品管\CPKPPK mkdir %1\品管\配合廠商 mkdir %1\車床\SOP mkdir %1\車床\機台程式 mkdir %1\銑床\SOP mkdir %1\銑床\機台程式 mkdir %1\後加工\SOP goto :eof 此帖於 2013-12-10 11:34 AM 被 getter 編輯. |
|
送花文章: 37855,
|
2013-10-31, 04:59 PM | #7 (permalink) |
管理員
|
用 for /F 的字典檔方式
語法:
@echo off :ReKeyIn set num1=bbbb set num2=cccc set name=AA call :Dirs set /p "name=請輸入資料夾名稱: " :ReNum1 set num1=bbbb call :Dirs set /p "num1=請輸入開始編號(1~9999): " set /a num1=%num1% if %num1% EQU bbbb ( echo.& echo.開始編號輸入為 0 錯誤,請重新輸入。 echo.& Pause & goto :ReNum1 ) if %num1% LSS 1 ( echo.& echo.開始編號輸入為 0 錯誤,請重新輸入。 echo.& Pause & goto :ReNum1 ) :ReNum2 set num2=cccc call :Dirs set /p "num2=請輸入結束編號(1~9999): " set /a num2=%num2% if %num2% EQU cccc ( echo.& echo.結束編號輸入為 0 錯誤,請重新輸入。 echo.& Pause & goto :ReNum2 ) if %num2% LSS 1 ( echo.& echo.結束編號輸入為 0 錯誤,請重新輸入。 echo.& Pause & goto :ReNum2 ) if %num1% GEQ %num2% ( echo.& echo.結束編號>=開始編號的錯誤,請重新輸入。 echo.& Pause & goto :ReNum2 ) call :Dirs set /p "YesNo=請確認資料夾名稱(正確輸入 Y,錯誤要重新輸入者輸入 N): " if /i %YesNo% == N (goto :ReKeyIn) if %num2% LSS 10 (goto run1) if %num2% GEQ 10 if %num2% LSS 100 (goto run2) if %num2% GEQ 100 if %num2% LSS 1000 (goto run3) if %num2% GEQ 1000 if %num2% LSS 10000 (goto run4) goto :eof :run1 for /L %%V in (%num1%,1,%num2%) do ( cls echo.建立資料夾: %name%-000%%V call:Make_Dirs %name%-000%%V ) goto :eof :run2 for /L %%V in (%num1%,1,%num2%) do ( cls echo.建立資料夾: %name%-00%%V call:Make_Dirs %name%-00%%V ) goto :eof :run3 for /L %%V in (%num1%,1,%num2%) do ( cls echo.建立資料夾: %name%-0%%V call:Make_Dirs %name%-0%%V ) goto :eof :run4 for /L %%V in (%num1%,1,%num2%) do ( cls echo.建立資料夾: %name%-%%V call:Make_Dirs %name%-%%V ) goto :eof :Dirs cls echo. if %num1% EQU bbbb if %num2% EQU cccc (echo.目標主資料名稱: "%name%-%num1%"~"%name%-%num2%") if %num1% LSS 10 if %num2% EQU cccc (echo.目標主資料名稱: "%name%-000%num1%"~"%name%-%num2%") else (echo.目標主資料名稱: "%name%-000%num1%"~"%name%-000%num2%") if %num1% GEQ 10 if %num1% LSS 100 if %num2% EQU cccc (echo.目標主資料名稱: "%name%-00%num1%"~"%name%-%num2%") else (echo.目標主資料名稱: "%name%-00%num1%"~"%name%-00%num2%") if %num1% GEQ 100 if %num1% LSS 1000 if %num2% EQU cccc (echo.目標主資料名稱: "%name%-0%num1%"~"%name%-%num2%") else (echo.目標主資料名稱: "%name%-0%num1%"~"%name%-0%num2%") if %num1% GEQ 1000 if %num1% LSS 10000 (echo.目標主資料名稱: "%name%-%num1%"~"%name%-%num2%") echo. goto :eof :Make_Dirs for /F "eol=; skip=1 tokens=1 delims=," %%A in ( MDs.txt ) do ( echo.建立子資料:"%%A" md "%1\%%A" ) goto :eof 字典檔需要與批次檔在一起,MDs.txt 字典檔 的內容 語法:
;MDs.txt 字典檔 開發\CAD 開發\PPAP 開發\成本 開發\成績表 開發\異常 品管\客訴 品管\不良品統計 品管\品質異常處理 品管\圖片及CP 品管\進料 品管\出貨 品管\量測資料 品管\特採申請 品管\產品定期稽核 品管\CPKPPK 品管\配合廠商 車床\SOP 車床\機台程式 銑床\SOP 銑床\機台程式 字典檔的方式主要是依照 FOR /F "eol=; skip=1 tokens=1 delims=," 的控制敘述 /F 表示開啟 FOR 的讀檔模式 " " 表示為 /F 的進階控制參數 eol=; 表示 ; 號之後的該行文字敘述為「註解」。 skip=3 表示一開始跳過的行數。 tokens=1 是對應的 FOR 的 %%V 參數的對應個數,詳細請參考 FOR /? 。 delims=, 表示 , 是用來決定單行資料區分,幾個區分斷的符號,當不輸入的話,以 預設值為空白、tab 符號為區隔。 詳細請參考 FOR /? 。 此帖於 2013-12-10 11:34 AM 被 getter 編輯. |
送花文章: 37855,
+20 金幣
|
2013-12-09, 03:09 PM | #8 (permalink) |
註冊會員
|
感謝getter指導
小弟目前還有一個疑問 選項3的第一層資料夾要帶入TXT檔建立 TXT檔內容是不連續號碼 例如 3323-119 3603-226 3603-227 3603-308 3603-309 3604-641 3604-647 3703-010 3703-011 3703-232 3703-233 3703-238 3703-239 然後第二層之後的資料夾 帶入:Make_Dirs的資料夾名稱 該如何改寫呢?? 再請指教 謝謝 語法:
@Echo off cd /d %~dp0 @Echo off TITLE=%titles% Echo ╔═════════════════╗ Echo ║ 編碼選擇: ║ Echo ║ 1.後3碼 按1 ║ Echo ║ 2.後4碼 案2 ║ Echo ║ 3.載入TXT檔 ║ Echo ╙═════════════════╜ set /p x=請選擇→ if /I "%x%"=="1" goto :1 if /I "%x%"=="2" goto :2 if /I "%x%"=="3" goto :3 cd /d %~dp0 echo 輸入錯誤 exit :1 set num1= set num2= set name= cls echo. %titles% echo. echo 請輸入資料夾名稱: set /p name= echo. echo. echo 請輸入開始編號(1~999): set /p num1= echo 請輸入結束編號(1~999): set /p num2= if %%V LSS 10 (goto run5) :run5 for /L %%V in (%num1%,1,%num2%) do ( IF %%V LSS 10 (call:Make_Dirs %name%-00%%V) IF %%V GEQ 10 IF %%V LEQ 99 (call:Make_Dirs %name%-0%%V) IF %%V GEQ 100 IF %%V LEQ 999 (call:Make_Dirs %name%-%%V) ) cls goto :eof :2 set num1= set num2= set name= cls echo. %titles% echo. echo 請輸入資料夾名稱: set /p name= echo. echo. echo 請輸入開始編號(1~9999): set /p num1= echo 請輸入結束編號(1~9999): set /p num2= if %%V LSS 10 (goto run1) if %%V GEQ 10 LEQ 99 (goto run2) if %%V GEQ 100 LEQ 999 (goto run3) if %%V GEQ 1000 LEQ 9999 (goto run4) cls :run1 for /L %%V in (%num1%,1,%num2%) do ( IF %%V LSS 10 (call:Make_Dirs %name%-000%%V) ) :run2 for /L %%V in (%num1%,1,%num2%) do ( IF %%V GEQ 10 IF %%V LEQ 99 (call:Make_Dirs %name%-00%%V) ) :run3 for /L %%V in (%num1%,1,%num2%) do ( IF %%V GEQ 100 IF %%V LEQ 999 (call:Make_Dirs %name%-0%%V) ) :run4 for /L %%V in (%num1%,1,%num2%) do ( IF %%V GEQ 1000 IF %%V LEQ 9999 (call:Make_Dirs %name%-%%V) ) cls :3 set name= cls echo. %titles% echo. echo 請輸入資料夾名稱: set /p name= echo. echo. for /F %%V in ( MDs.txt ) do ( echo.建立子資料:"%%V" (call:Make_Dirs %name%) ) cls :Make_Dirs rem =======開 發 單 位 ======= mkdir %1\開發\APQP mkdir %1\開發\CAD mkdir %1\開發\mail紀錄 mkdir %1\開發\PCR mkdir %1\開發\PPAP mkdir %1\開發\包裝 mkdir %1\開發\成本 mkdir %1\開發\成績表 mkdir %1\開發\附件相片圖示 mkdir %1\開發\特採 mkdir %1\開發\異常 mkdir %1\開發\設計變更 rem =======品 管 單 位 ======= mkdir %1\品管\客訴 mkdir %1\品管\不良品統計 mkdir %1\品管\品質異常處理 mkdir %1\品管\圖片及CP mkdir %1\品管\進料 mkdir %1\品管\出貨 mkdir %1\品管\量測資料 mkdir %1\品管\特採申請 mkdir %1\品管\產品定期稽核 mkdir %1\品管\CPKPPK mkdir %1\品管\配合廠商 rem =======車 床 單 位 ======= mkdir %1\車床\SOP mkdir %1\車床\機台程式 rem =======銑 床 單 位 ======= mkdir %1\銑床\SOP mkdir %1\銑床\機台程式 rem =======後 加 工 單 位 ======= mkdir %1\後加工\SOP 此帖於 2013-12-09 10:49 PM 被 victor624 編輯. |
送花文章: 0,
|
2013-12-09, 06:49 PM | #9 (permalink) | |
管理員
|
引用:
2.再來是用 for /f 的 參數沒有給當然會不行 ... 先參考一下我先前貼的那個 字典檔的法 ... 剩下的等我的屁屁(條狀物要大出來了 ... )好點再來詳細弄 |
|
送花文章: 37855,
|
向 getter 送花的會員:
|
a471 (2013-12-09)
感謝您發表一篇好文章 |
2013-12-09, 10:37 PM | #10 (permalink) | |
註冊會員
|
引用:
回 getter 我詳細說明這次新增的功能 首先選第3項 會要求輸入資料夾名稱(第一層) 假如是AAA 之後她會帶入TXT檔內部的資料夾名稱(第二層) 之後AAA底下會產生TXT的編號 TXT底下會帶出:Make_Dirs所有子資料夾 因為這些編號不連貫 所以必須透過TXT檔帶入 選項1-2功能不變 主要是給編號連續的時候使用的 請指教 謝謝!! TXT內容 語法:
3323-119 3603-226 3603-227 3603-308 3603-309 3604-641 3604-647 3703-010 3703-011 3703-232 3703-233 3703-238 3703-239 0402-333 0402-354 0402-478 0402-909 0402-950 0402-951 0402-974 0402-984 0402-945 0403-039 0403-079 0404-170 0404-179 0404-199 0404-215 0404-218 0404-203 0404-207 0404-218 0404-219 0404-242 0404-247 0405-052 0405-062 0405-205 0405-219 0405-245 0405-263 0405-272 0405-319 0405-320 0405-340 0405-368 0405-379 0405-381 0405-383 0405-388 0405-440 0405-446 0409-066 0410-196 0410-200 0413-136 0413-145 0423-042 0423-359 0423-359 0423-393 0423-395 0423-411 0423-450 0436-355 0436-659 0441-893 0443-061 0443-063 0444-263 0444-264 0470-915 0470-918 0492-029 0492-075 0492-077 0492-078 0492-085 0492-090 0492-110 0492-111 0502-042 0502-164 0502-258 0502-273 0502-321 0502-348 0502-421 0502-423 0502-517 0502-521 0502-522 0502-766 0502-797 0502-828 0502-833 0502-857 0502-967(1402-467) 0502-969(1402-485) 0502-970(1402-487) 0502-973(1402-499) 0502-976+8 0502-999 0503-040_041 0503-311(0403-155) 0503-321(0403-151) 0503-456+7 0503-462 0503-464 0503-483 0503-546+7 0503-628+9 0503-644 0503-748+9 0504-610 0504-651 0504-656+7 0504-676 0504-678 0504-746+9 0504-757 0505-414 0505-773+4 0505-776+7 0541-842 0544-010+011 0570-345 0605-713 0605-858 0605-906 0605-907 0605-908(1619-124) 0605-927 0605-928 0605-932 0605-943 0605-969 0607-711 0607-712 0607-716+717 0607-806_7 0608-610 0613-011 0613-012 0619-907 0630-273 0645-606 0645-632 0648-787 0675-030 0702-995 0708-577 0745-368 手動輸入資料夾名稱 出不來 !!! 語法:
@Echo off cd /d %~dp0 @Echo off set titles=大量新增資料夾 V6.0版 echo 大量新增資料夾 64.0版 TITLE=%titles% Echo ╔═════════════════╗ Echo ║ 編碼選擇: ║ Echo ║ 1.後3碼 按1 ║ Echo ║ 2.後4碼 案2 ║ Echo ║ 3.載入TXT檔 ║ Echo ╙═════════════════╜ set /p x=請選擇→ if /I "%x%"=="1" goto :1 if /I "%x%"=="2" goto :2 if /I "%x%"=="3" goto :3 cd /d %~dp0 echo 輸入錯誤 exit :1 set num1= set num2= set name= cls echo. %titles% echo. echo 請輸入資料夾名稱: set /p name= echo. echo. echo 請輸入開始編號(1~999): set /p num1= echo 請輸入結束編號(1~999): set /p num2= if %%V LSS 10 (goto run5) :run5 for /L %%V in (%num1%,1,%num2%) do ( IF %%V LSS 10 (call:Make_Dirs %name%-00%%V) IF %%V GEQ 10 IF %%V LEQ 99 (call:Make_Dirs %name%-0%%V) IF %%V GEQ 100 IF %%V LEQ 999 (call:Make_Dirs %name%-%%V) ) cls goto :eof :2 set num1= set num2= set name= cls echo. %titles% echo. echo 請輸入資料夾名稱: set /p name= echo. echo. echo 請輸入開始編號(1~9999): set /p num1= echo 請輸入結束編號(1~9999): set /p num2= if %%V LSS 10 (goto run1) if %%V GEQ 10 LEQ 99 (goto run2) if %%V GEQ 100 LEQ 999 (goto run3) if %%V GEQ 1000 LEQ 9999 (goto run4) cls :run1 for /L %%V in (%num1%,1,%num2%) do ( IF %%V LSS 10 (call:Make_Dirs %name%-000%%V) ) :run2 for /L %%V in (%num1%,1,%num2%) do ( IF %%V GEQ 10 IF %%V LEQ 99 (call:Make_Dirs %name%-00%%V) ) :run3 for /L %%V in (%num1%,1,%num2%) do ( IF %%V GEQ 100 IF %%V LEQ 999 (call:Make_Dirs %name%-0%%V) ) :run4 for /L %%V in (%num1%,1,%num2%) do ( IF %%V GEQ 1000 IF %%V LEQ 9999 (call:Make_Dirs %name%-%%V) ) cls :3 cd /d %~dp0 set name= cls echo. %titles% echo. echo 請輸入資料夾名稱: set /p name= echo. echo. for /F "eol=; skip=1 tokens=1 delims=," %%V in ( MDs.txt ) do ( call:Make_Dirs %%V ) cls :Make_Dirs rem =======開 發 單 位 ======= mkdir %1\開發\APQP mkdir %1\開發\CAD mkdir %1\開發\mail紀錄 mkdir %1\開發\PCR mkdir %1\開發\PPAP mkdir %1\開發\包裝 mkdir %1\開發\成本 mkdir %1\開發\成績表 mkdir %1\開發\附件相片圖示 mkdir %1\開發\特採 mkdir %1\開發\異常 mkdir %1\開發\設計變更 rem =======品 管 單 位 ======= mkdir %1\品管\客訴 mkdir %1\品管\不良品統計 mkdir %1\品管\品質異常處理 mkdir %1\品管\圖片及CP mkdir %1\品管\進料 mkdir %1\品管\出貨 mkdir %1\品管\量測資料 mkdir %1\品管\特採申請 mkdir %1\品管\產品定期稽核 mkdir %1\品管\CPKPPK mkdir %1\品管\配合廠商 rem =======車 床 單 位 ======= mkdir %1\車床\SOP mkdir %1\車床\機台程式 rem =======銑 床 單 位 ======= mkdir %1\銑床\SOP mkdir %1\銑床\機台程式 rem =======後 加 工 單 位 ======= mkdir %1\後加工\SOP 此帖於 2013-12-09 10:50 PM 被 victor624 編輯. |
|
送花文章: 0,
|
向 victor624 送花的會員:
|
a471 (2013-12-10)
感謝您發表一篇好文章 |
2013-12-10, 03:20 PM | #11 (permalink) | |
管理員
|
引用:
也就是說就是 AAA\TXT內容\Make_Dirs意思嗎 語法:
@Echo off setlocal cd /d %~dp0 set Version=6.0 set titles=大量新增資料夾 %Version% 版 set TXT_File=%~n0.txt title=%titles% :選單 cls echo.%titles%:選單畫面 echo.╔═══════════╗ echo.║編碼選擇: ║ echo.║ 1.後 3 碼,請按 1 ║ echo.║ 2.後 4 碼,請按 2 ║ echo.║ 3.載入 TXT 檔,請按 3║ echo.║ ║ echo.║ 0.離開 ║ echo.╚═══════════╝ set /p select=請選擇: set /a select=%select% if %select% == 0 ( goto :End ) if %select% GTR 0 if %select% LEQ 3 ( cls & goto Function_%select% ) echo.輸入錯誤,請重新輸入 echo. pause goto :選單 :End endlocal exit :Function_1 echo. %titles%:後 3 碼 call :Input call :Run_Make_Continuous_Dir goto :End :Function_2 echo. %titles%:後 4 碼 call :Input call :Run_Make_Continuous_Dir goto :End :Function_3 echo. %titles%:載入 TXT 檔 echo. if not exist "%TXT_File%" ( echo.找不到 %TXT_File% 的錯誤,執行終止。 echo. pause goto :End ) set /p name=請輸入資料夾名稱: echo. echo. mkdir %name% for /F "eol=; tokens=1 delims=." %%V in ( %TXT_File% ) do ( call :Make_Dirs "%name%\%%V" ) goto :End :Input echo. set /p name=請輸入資料夾名稱: echo. :num-1 set /p num1=請輸入開始編號: set /a num1=%num1% if %select% == 1 ( if %num1% GTR 0 if %num1% LSS 1000 goto :num-2 ) & goto :num-1 if %select% == 2 ( if %num1% GTR 0 if %num1% LSS 10000 goto :num-2 ) & goto :num-1 :num-2 echo. set /p num2=請輸入結束編號: set /a num2=%num2% if %select% == 1 ( if %num2% GTR %num1% if %num2% LSS 1000 goto :eof ) & goto :num-2 if %select% == 2 ( if %num2% GTR %num1% if %num2% LSS 10000 goto :eof ) & goto :num-2 goto :eof :Run_Make_Continuous_Dir for /L %%V in (%num1%,1,%num2%) do ( rem 後 3 碼方法 if %select% == 1 if %%V LSS 10 ( call :Make_Dirs "%name%-00%%V" ) if %select% == 1 if %%V GEQ 10 if %%V LSS 100 ( call :Make_Dirs "%name%-0%%V" ) if %select% == 1 if %%V GEQ 100 if %%V LSS 1000 ( call :Make_Dirs "%name%-%%V" ) rem 後 4 碼方法 if %select% == 2 if %%V LSS 10 ( call :Make_Dirs "%name%-000%%V" ) if %select% == 2 if %%V GEQ 10 if %%V LSS 100 ( call :Make_Dirs "%name%-00%%V" ) if %select% == 2 if %%V GEQ 100 if %%V LSS 1000 ( call :Make_Dirs "%name%-0%%V" ) if %select% == 2 if %%V GEQ 1000 if %%V LSS 10000 ( call :Make_Dirs "%name%-%%V" ) ) goto :eof :Make_Dirs if "%~1" == "" goto :eof rem =======開 發 單 位 ======= mkdir "%~1\開發\APQP" mkdir "%~1\開發\CAD" mkdir "%~1\開發\mail紀錄" mkdir "%~1\開發\PCR" mkdir "%~1\開發\PPAP" mkdir "%~1\開發\包裝" mkdir "%~1\開發\成本" mkdir "%~1\開發\成績表" mkdir "%~1\開發\附件相片圖示" mkdir "%~1\開發\特採" mkdir "%~1\開發\異常" mkdir "%~1\開發\設計變更" rem =======品 管 單 位 ======= mkdir "%~1\品管\客訴" mkdir "%~1\品管\不良品統計" mkdir "%~1\品管\品質異常處理" mkdir "%~1\品管\圖片及CP" mkdir "%~1\品管\進料" mkdir "%~1\品管\出貨" mkdir "%~1\品管\量測資料" mkdir "%~1\品管\特採申請" mkdir "%~1\品管\產品定期稽核" mkdir "%~1\品管\CPKPPK" mkdir "%~1\品管\配合廠商" rem =======車 床 單 位 ======= mkdir "%~1\車床\SOP" mkdir "%~1\車床\機台程式" rem =======銑 床 單 位 ======= mkdir "%~1\銑床\SOP" mkdir "%~1\銑床\機台程式" rem =======後 加 工 單 位 ======= mkdir "%~1\後加工\SOP" goto :eof 1.要能依照那個意思建立資料夾,需要有正確的指令給予才行,如 mkdir %name% 以及 "%name%\%%V"。當然沒有給對,自然就沒有作用。 2.標籤的部份,可以使用中文,但是要注意系統的 CMD 本版是否有支援到,若怕不支援還是建議用英文編寫。 3.當以 3 號選項執行時,要注意一些事情,文字檔的部份可能,初期測試發現會在 \ 的位置有另外建立 資料夾, 此也加入 if "%~1" == "" goto :eof 的語法抑制。可能受不同的 CMD 版本有無作用要在注意。 4.TXT 檔名,目前設定是以 set TXT_File=%~n0.txt 控制著,需要與批次檔的主檔名相同的 .txt。 如 abc.bat 的話就要是 abc.txt 才能正常執行。 5.因為有使用 txt 檔,有加入 if not exist "%TXT_File%" 用來找尋, 有沒有 txt 檔的存在,有的話第 3 項才可以正常執行。 6.有關於 txt 檔的部份,一開始的行數是不回會跳過的。以『;』為註解符號,也就是說 『;』開頭的是註解,不會被讀入的。 7.有大幅調整一部分的語法,使用了某些如類似 java 的觀念,如單一功能的多行集合之類。具有數值的質範圍除錯的機能、 選單重回機制(這是基本選單該有的功能吧),使用了某種特殊的選單值域 goto 的方式,就不用一堆 goto :1~3。 數值輸入也有修改,有使用某種檢驗機制,就某些狀況來說有輸入的檢驗機制是對的,因此使用了數值化檢驗的方式。 如 set /a num=%num%,這個動作是把輸入的『字串的數字』變成了『數值的數字』,其實就是資料型態的轉換。 如 01 跟 1 的差別。以人的觀點來說不都是 1 嗎? 對電腦來說,卻是不一樣的,是數值的 1 還是文字的 1。在電腦內不 這兩著是完全不一樣的。數值的 1 可以作運算的,文字的 1 只有表示的作用。因此需要轉換。再進一步給 if 判斷,這樣 就比較不容易出錯了。 8."%~1" 這個目的,是為了避免 " 符號問題,在迪西的電腦測試,結果是不影響結果的。但別的電腦,可能因為不同的 CMD 或 Command.com 的版本不同而可能會不一樣。 9.在變數符號上面加上 " 符號,如 "%%1" 或是 "%num%"。是為了確保該變數傳遞的正確文字範圍,不會混到而外的 空白字符 。此外當變數內容需要有空白字符時,如 "abc 123",才會被確定是一個完整的資料,而不會被解讀成兩個資 料。 txt檔的大約內容如下 語法:
;3323-119 註解行 ;3603-226 註解行 3603;227 ; 註解行 3703-232 3703-233 3703-238 3703-239 此帖於 2013-12-15 07:01 AM 被 getter 編輯. 原因: 補充 |
|
送花文章: 37855,
|