Windows Command 失敗的案例
有一台提供備份的 Windows 主機,主要提供的工作設想為:根據備份對象當天異動的所有檔案進行複製
- 在備份資料夾新增當天日期資料夾
- 搜尋備份對象所有當天異動檔案,並複製到當天資料夾內
一開始只打算使用 DOS Command 也就是最基礎的指令設計,摸索了一下,寫了下面這個批次檔:
1 2 3 4 5 6 7 |
@Echo On SET _date=%date:~0,4%-%date:~5,2%-%date:~8,2% SET _xcopydate=%date:~5,2%-%date:~8,2%-%date:~0,4% MKDIR C:\BACKUP\%_date% CD C:\BACKUP\%_date% XCOPY C:\TEST /E/C/H/Y/D:%_xcopydate% PAUSE |
決定使用 windows batch file 是錯誤的決定,因為來源檔案有重複檔名,因此需要加上一個流水碼避免覆蓋。如果使用 xcopy 指令搜尋符合日期檔案複製,那就無法進行檔名的變更,最後我又使用 PHP 處理。
PHP 程式運作流程
- 使用系統指令 DIR 產生所有檔案列表,建立成文字檔
- 建立當日備份日期目錄
- 解析 DIR 文字檔內容,搜尋符合日期檔案
- 將符合檔案加上流水碼複製到日期目錄中
1. 產生所有列表檔案以及生成文字檔
1 |
DIR /S/A > E:\DIR.TXT |
2. 建立當日備份日期目錄
1 2 3 4 |
<?php $now_day = date( "Ymd" ); exec( 'mkdir e:\\'. $now_day ); ?> |
3. 解析文字檔案,找到符合條件檔案
產生的檔案列表格式大致就像下面這樣,不同系統,不同指令參數會得到不同的格式。大致上需要處理的就是
- 以 z: 為判讀的「目錄」路徑
- 以日期格式開頭的檔案名稱
- 以及排除同樣是日期名稱開頭,但是檔名開頭為「 . 」 的目錄敘述
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
Z:\2013-01-小高一xxx\yyy\2 完成檔1080\2 元件式分類\01 zzz-實驗室與基本測量 的目錄 2013/06/03 下午 05:10 <DIR> . 2013/06/03 下午 05:10 <DIR> .. 2013/05/21 下午 01:42 838,210,111 01-1實驗室與基本測量.mp4 2013/05/21 下午 01:42 131,649,563 01-2例題01.mp4 2013/05/21 下午 01:42 308,056,095 01-3例題02.03.mp4 2013/05/21 下午 01:42 270,438,148 01-4例題05.mp4 2013/05/21 下午 01:14 16,384 Thumbs.db 5 個檔案 1,548,370,301 位元組 Z:\2013-01-小高一xxx\yyy\2 完成檔1080\2 元件式分類\02 zzz-物質、水與空氣 的目錄 2013/06/03 下午 05:11 <DIR> . 2013/06/03 下午 05:11 <DIR> .. 2013/05/21 下午 01:58 158,026,782 02-10範例09.mp4 2013/05/21 下午 01:58 921,115,772 02-1物質、水與空氣.mp4 2013/05/21 下午 01:58 75,175,065 02-2範例01.mp4 2013/05/21 下午 01:58 243,817,570 02-3範例02.mp4 2013/05/21 下午 01:58 101,381,077 02-4範例03.mp4 2013/05/21 下午 01:58 93,466,869 02-5範例04.mp4 2013/05/21 下午 01:58 234,268,526 02-6範例05.mp4 2013/05/21 下午 01:58 263,017,288 02-7範例06.mp4 2013/05/21 下午 01:58 300,708,589 02-8範例07.mp4 2013/05/21 下午 01:58 188,152,600 02-9範例08.mp4 2013/05/21 下午 01:29 12,800 Thumbs.db 11 個檔案 2,579,142,938 位元組 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php exec( 'mkdir e:\\'. $now_day ); exec( 'dir z:/s/a > e:\dir.txt' ); $openfile = fopen( 'e:\dir.txt', "r" ); $file_count = 1; unset( $path ); while (($str = fgets($openfile, 4096)) !== false) { # [0] : 第一個字 # [41] . 自己 & 上一層 if ( $str[41] == '.' || $str == '' ) continue; // 如果是空白或是沒營養的 . ,所以可以 PASS 了 # 路徑名稱 if ( $str[1].$str[2] == 'Z:' ) $path = substr( $str, 1, -9 ); if ( $str[0].$str[1].$str[2].$str[3].$str[5].$str[6].$str[8].$str[9] == $now_day ) { $file_name = substr( $str, 41 ); $file_name = substr( $file_name, 0, -2 ); $source = '"'. $path .'\\'. $file_name .'"'; // 來源 $target = '"e:\\'. $now_day .'\\'. $file_count .'_'. $file_name .'"'; // 目標 exec( "copy $source $target " ); } $file_count++; } ?> |
程式技巧
待加強、開發
- 取用檔案使用 WEB 介面 → 安裝 Apache
- 將複製來源及備份檔案關聯紀錄,方便取用時確定對象及搜尋 → 安裝 MariaDB,
- 針對以上需求開發網頁程式
6,017 total views, 1 views today