2015-03-03 16 views
0

我正在處理一個批處理腳本,用於根據文件名將文件從具有1000個以上文件的主目錄移動到子文件夾,必須創建和移動子文件夾因此。以下是場景/文件名稱格式。在'最後發生時'拆分文件名''

  • title_or_work_done_by_user_name.xls

從這個文件名模式,我要挑 「USER_NAME」,並創建該USER_NAME的文件夾。我發現了類似的代碼,但無法在最後的'by'中完全打破它。

@ECHO OFF 
SETLOCAL 
SET "sourcedir=E:\Source" 
SET "destdir=E:\Destination" 


FOR /f "tokens=2*delims='by_'" %%a IN ('dir /b /a-d "%sourcedir%\*by_*.xls" ') DO (
ECHO %%a 
ECHO(MD "%destdir%\%%a" 2>nul 
ECHO(MOVE "%sourcedir%\*by_%%a.xls" "%destdir%\%%a\") 
pause 
GOTO :EOF 

有人可以通過在'by_'的最後一次出現時分割'user_name'來幫助我解壓縮'user_name'。

感謝提前:)

回答

0

的DELIMS選項指定的字符,而不是字符串列表。因此,您的FOR循環將分割標記'_by。另外,您無法知道最後一個令牌的數字是多少。你的設計是一個死路一條。


選項1

這是一個純粹的批量解決方案,將你想要做什麼。我使用替換將文件名轉換爲僞路徑。然後輕鬆選取所需的名稱。延遲擴展用於訪問設置它的同一個循環(代碼塊)內的變量值。唯一棘手的部分是根據需要打開和關閉延遲擴展,以保留任何!。如果包含!字符的FOR變量在擴展時啓用延遲擴展,則它將被損壞。

@echo off 
setlocal disableDelayedExpansion 

for %%F in (*_by_*.jpg) do (

    %= Initialize name without extension =% 
    set "name=%%~nF" 

    %= Convert "Part1_by_Part2_by_Name" into "Part1\Part2\Name" =% 
    setlocal enableDelayedExpansion 
    for %%f in ("!name: - =\!") do (

    %= Only execute endlocal on the first iteration =% 
    if "!!" equ "" endlocal 

    %= The name might contain a dot, so need name and extension =% 
    set "name=%%~nxf" 
) 
    set "file=%%F" 
    setlocal enableDelayedExpansion 

    %= Hide error message if folder already exists =% 
    md "!name!" 2>nul 

    move "!file!" "!name!" 
    endlocal 
) 


選項2

的邏輯是簡單的,如果使用的子程序,因爲它避免了延遲擴展的問題。 CALL使代碼效率較低(較慢),但這不應該成爲這樣的任務的問題。

@echo off 
setlocal disableDelayedExpansion 

for %%F in (*_by_*.jpg) do call :moveFile "%%F" 
exit /b 

:moveFile 
set "name=%~n1" 
for %%F in ("%name:_by_=\%") do set "name=%%~nxF" 
md "%name%" 2>nul 
move %1 "%name%" 
exit /b 


選項3

最簡單的解決方案是使用我的JREPL.BAT utility - 混合的JScript /批執行正則表達式置換腳本。 JREPL是純粹的腳本,可以在任何Windows XP機器上運行。

@echo off 
for /f "tokens=1,2 delims=: eol=:" %%A in (
    'dir /b /a-d *_by_*.jpg ^| jrepl "^.*_by_(.*)\.jpg" "$&:$1" /i' 
) do (
    md "%%B" 2>nul 
    move "%%A" "%%B" 
) 
0
@ECHO OFF 
SETLOCAL 

FOR %%a IN (

title_or_work_done_by_user_name.xls 
title_or_work_done_by_digby_hill.xls 
title_or_work_done_by_hook_or_by_crook.xls 

) DO CALL :process %%a 
GOTO :eof 

:process 
SET "name=%~1" 

:: This is the actual processing 
ECHO processing "%name%" 
SET "name=%name:_by_=.%" 
:loop 
FOR /f "tokens=1,2,3*delims=." %%p IN ("%name%") DO IF "%%s"=="" (SET "user_name=%%q") ELSE (
SET "name=%%q.%%r.%%s"&GOTO loop 
) 
ECHO extracted name is "%user_name%" 

GOTO :EOF 

我選擇要使用的字符串_by_作爲分隔符,因爲有一些結束「的」名稱。

只需將字符串_by_替換爲文件名中不會出現(或限制使用)的字符串即可。我選擇了 byt可能帶有sme修飾(例如使用%~n可以使用從名稱中刪除擴展名。

的reult是[字符串] * required_name.xls

通過反覆去除使用所述第一令牌。作爲分隔符,當沒有4th +標記時,則第二個標記將是必需的字符串。