2014-01-23 148 views
0

我正在嘗試創建一個腳本,它將從文件中拉出文件名的前兩個字符,使一個包含這兩個字符的目錄(順便說一句,它們是數字)並最終將原始文件放入這些文件夾中。我能夠部分地做到這一點使用下面的代碼行(沒有額外的內容)批處理腳本 - 缺少字符

IF EXIST 01* (MKDIR 01) 
IF EXIST 02* (MKDIR 02) 
IF EXIST 01* (MOVE 01* 01) 
IF EXIST 02* (MOVE 02* 02) 

這顯然是低效率的,需要的腳本編輯,如果我有比文件的施氮量更多。然後我做了一些挖掘,我發現這個劇本,我試圖修改不成功適合我的需要

SETLOCAL ENABLEDELAYEDEXPANSION 
FOR /R %%g IN (*) DO (
    SET fileName=%%~ng 
    MKDIR !fileName:~2! 
) 

此腳本完成排序。我的測試文件名稱看起來像0102.txt,0203.txt,0304.txt等等。取代第一部分01,02,03等的劇本,它抓住了第二部分02,03,04等,並切斷了前兩個字符。我在腳本中執行了一個回聲,我甚至可以看到它刪除了前兩個字符。這很奇怪,因爲我甚至可以做

SETLOCAL ENABLEDELAYEDEXPANSION 
FOR /R %%g IN (*) DO (
    SET fileName=%%~ng 
    MKDIR !fileName! 
    REN !fileName! !fileName:~2! 
) 

我仍然會得到相同的結果。有沒有人有任何想法來解決這個問題?

回答

1

關鍵是你的問題是substringing設施

set avar=%bvar:~start,length% 

其中%可能的語法!如果合適的話,
start是起始位置,開始「字符0」。
start可能是負的,意思是「這個數目的字符從%BVAR%結束」
,length可以省略,意思是「字符串的從start
,length其餘部分可以是負的含義「這數目的字符從%bvar%「的末端」

這應該讓你解決問題。

+0

我這將在一秒鐘內完成。我一直忙於工作和事情,所以我沒有機會來這裏看看。 – toddimyre

+0

謝謝。這工作完美。當我借用原始代碼時,我忘記了最初的修飾符。 – toddimyre

1

你還沒有說你的編號文件的範圍,但這將處理01 * - * 09

@echo off 
for /L %%a in (1,1,9) do if exist 0%%a* (md 0%%a 2>nul & move 0%%a* 0%%a) 

額外添加的行會處理來自10 * 99 *

for /L %%a in (10,1,99) do if exist %%a* (md %%a 2>nul & move %%a* %%a) 
+0

我先嚐試了FOR/L。我無法弄清楚如何設置它來提取正確的信息,因爲FOR/L IN(1,1,9)往往只能拉1,2,3等。我的文件列爲01,02,03,等等。原因是因爲它們從不超過99,並且它將文件按特定的順序排列。儘管我很欣賞這個輸入,我也會給出這個代碼。 – toddimyre

+0

我也剛剛回想起我使用其他設置的原因是爲了使腳本對於不同的文件集更通用。而且我剛剛注意到你的初始0,它將擴展爲允許01,02,03等。再一次,感謝你的編碼,但我認爲以前的答案會更好地服務於我的目的。 – toddimyre