iT邦幫忙

0

要如何使用批次檔將檔案中的"修改日期"轉成檔名

mo0904 2 年前5030 瀏覽

在同一資料夾有分別有不同日期的檔案,請問要如何使用批次檔將這些檔案分別各自建立由"修改日期"所產生的檔名?
例如:bac.txt ,2014/10/1建立,因歸檔不會每天執行該如何將檔案自動歸類並建立為"20141001"檔案.

請各位大大幫忙...

2
蟹老闆
iT邦大師 1 級 ‧ 2 年前
最佳解答

如果同一天產生二天個會有問題,所以應該要加上時間會比較好.

<pre class="c" name="code">
SETLOCAL ENABLEDELAYEDEXPANSION
Echo Off
for %%i in (*) do (
set name=%%~ti
set slash=!name:/=!
ren "%%~nxi" "!slash::=!%%~xi"
)
看更多先前的回應...收起先前的回應...
蟹老闆 iT邦大師 1 級 ‧ 2 年前 檢舉

dream提到:
二天個

更正:
二個檔

mo0904 iT邦新手 5 級 ‧ 2 年前 檢舉

謝謝大大~不過這樣檔名會直接改掉了!

在大概描述一下:
檔案名稱A:bac.txt,建立時間為2014/10/1
檔案名稱B:bbc.txt,建立時間為2014/10/6
目前想依據檔案"建立時間",將它們各自歸類
檔案名稱A自動移轉或自動產生一個"20141001"的資料
檔案名稱B自動移轉或自動產生一個"20141006"的資料

以下的批次檔可以抓出日期但無法將"檔案"移動到或另外在產生的"20141001"資料夾,也就是無法偵測日期後自動歸類.

for/f "skip=4 tokens=1-3 delims=/" %%i in ('dir /o-d "b*"') do set day="%%i%%j%%k" & copy "b*" %day%

還麻煩大大指導了!

蟹老闆 iT邦大師 1 級 ‧ 2 年前 檢舉

mo0904提到:
該如何將檔案自動歸類並建立為"20141001"檔案.

誤解了.........

<pre class="c" name="code">
SETLOCAL ENABLEDELAYEDEXPANSION
Echo Off
for %%i in ("%~pd0Test\*") do (
Echo "%%~nxi"
set name=%%~ti  
set slash=!name:/=!  
Move "%%~fi" %%~pdi!slash:~0,8!\||(MD %%~pdi!slash:~0,8!&Move "%%~fi" %%~pdi"!slash:~0,8!\")
)

要執行的批次檔需放在在上層目錄,請自行修改("%~pd0Test\*")中的目錄名稱
以範例來說會對在這個批次檔的子目錄TEST中執行分類及移動.

mo0904 iT邦新手 5 級 ‧ 2 年前 檢舉

謝謝大大~~~

另外想請教,在迴圈中設定的變數,應該如何撰寫呢?(迴圈.變數以及符號的搭配一直搞不懂該怎麼撰寫才能成為我想要的結果呢?)找了很多網站資料也都很零碎!!或者是什麼書籍,網站可以學習呢?

蟹老闆 iT邦大師 1 級 ‧ 2 年前 檢舉

SET 如果要在 FOR 中使用且 SET 在 FOR 中會改變那就需要在 FOR 之前加上 SETLOCAL ENABLEDELAYEDEXPANSION 使用 DOS 的擴充功能來展開變數?(讀取?),若沒有使用 SETLOCAL ENABLEDELAYEDEXPANSION 則 SET 在 FOR 結束時才會賦值給 SET
例:
test.txt文字檔中有三行文字
ABC
DEF
GHI

<pre class="c" name="code">
FOR /F %I IN ('TYPE TEST.TXT') DO echo %I
輸出
ABC
DEF
GHI

換成
FOR /F %I IN ('TYPE TEST.TXT') DO set AA=%I
輸出
SET AA=ABC
SET AA=DEF
SET AA=GHI

換成
SET AA=ZZ
FOR /F %I IN ('TYPE TEST.TXT') DO set AA=%I&ECHO %AA%
輸出
ZZ
ZZ
ZZ

也就是說當變數被展開(讀取)時就決定了它的值,當 for 中要設定(set)新值時它並不會立即生效,會在結束時才賦值 SET .
如果加上 SETLOCAL ENABLEDELAYEDEXPANSION 就不同了,它會立即改變變數的值
什麼時候會用到 SETLOCAL ENABLEDELAYEDEXPANSION ? 除了for外還有多階層的 IF 也會要用到,依這個慣性來說一組的指令碼也會受到影響.

mo0904 iT邦新手 5 級 ‧ 2 年前 檢舉

謝謝大大~雖然大致了解,但要寫出完整的程式對我還是蠻困難的!
可以請您指導變數[set slash=!name:/=!]這語言意思是?

蟹老闆 iT邦大師 1 級 ‧ 2 年前 檢舉

mo0904提到:
可以請您指導變數[set slash=!name:/=!]這語言意思是?

name 為取得的檔案日期格式為 0000/00/00
slash 為替換後的目錄名 00000000
解說:
設定 slash 變數為 name 變數的內容,但 name 的變數因為有 / 符號不符檔案命名原則,所以需要以 !name:/=! 將 / 符號去除
這個擴充功能主要是替換的功能,還可以是其它符號,例如 !name:/=-! 這樣的結果就會變成 0000-00-00 或是其它任意符號,也可以應用在 %% 所定義的變數.

蟹老闆 iT邦大師 1 級 ‧ 2 年前 檢舉

%%~pdi!slash:~0,8!

因為後面還有無關字元,所以用%%~pdi!slash:~0,8!
只取前八個字元

mo0904 iT邦新手 5 級 ‧ 2 年前 檢舉

原來如此~謝謝大大的解說!!!

setlocal enabledelayedexpansion
for %%i in ("%~pd0S*") do (
set name=%%~ti
set slash=!name:/=!
if %name% lss 20141030 goto 2
)
我模擬了大大先取出檔案日期格式,但想把它改變成判斷"這個日期格式若小於指定日期"就會出現錯誤,若大於就直接執行下個動作;結果變成不管對錯都直接走錯誤訊息。
可否請大大指導一下.....感恩

蟹老闆 iT邦大師 1 級 ‧ 2 年前 檢舉

mo0904提到:
if %name% lss 20141030 goto 2

要換成 !name!

mo0904 iT邦新手 5 級 ‧ 2 年前 檢舉

if !name! lss 20141030 goto 2
雖然可以執行,但還是不管條件是否正確都直接走goto 2的指令!!

蟹老闆 iT邦大師 1 級 ‧ 2 年前 檢舉

mo0904提到:

set slash=!name:/=!
if %name% lss 20141030 goto 2
)

在中間插入
echo !slash!
pause
看看 !slash! 取得的值是什麼.

mo0904 iT邦新手 5 級 ‧ 2 年前 檢舉

非常感謝大大~終於找到問題解決了!

原來IF帶的值應該是!Slash!....

2
hector958
iT邦研究生 2 級 ‧ 2 年前

用FORFILE指令不知道能不能符合你的需求,

http://technet.microsoft.com/en-us/library/cc753551.aspx

2
海綿寶寶
iT邦超人 1 級 ‧ 2 年前

試試看這段可不可用
請注意
1.先弄個小目錄和一些檔案來測試,不要直接上正式資料
2.之中的 *.txt 僅為舉例,可改成 *.log 或其他檔案副檔名

<pre class="c" name="code">
FOR %%f IN (*.txt) DO SET filetime=%%~tf | MKDIR %filetime:~0,4%%filetime:~5,2%%filetime:~8,2% | MOVE %%f %filetime:~0,4%%filetime:~5,2%%filetime:~8,2%
mo0904 iT邦新手 5 級 ‧ 2 年前 檢舉

謝謝大大~但是執行後目錄名稱是無效的,也未成功歸類!!

我要發表回答

立即登入回答