2017-09-13 136 views
1

有兩個方面我需要一些指導,但不確定這是否可行。請注意,下面的代碼按預期工作。使用批處理文件根據文件名創建文件夾和可選子文件夾

@echo off 
setlocal 
set "sourcedir=C:\FILETEST" 
pushd %sourcedir% 
for /f "tokens=1,2*delims=-" %%a in (
'dir /b /a-d *-*--*.*' 
) do if "%%c" neq "" ( 
md "%%a-%%b" 
move "%%a-%%b--%%c" ".\%%a-%%b\" 
) 
popd 
goto :eof 

上面的代碼爲迎合文件名有一個「 - 」和「 - 」,例如文件名「英國倫敦 - filename.doc」將創建一個文件夾「英國倫敦」,並把文件在那裏。

但是,還有其他更詳細的文件名,例如文件名「EU-UK - London-Camden - filename.doc」。下面的腳本適用於本例中,將創建一個文件夾「EU-UK」,然後一個子文件夾「在倫敦的卡姆登」,並把那裏的文件:

@echo off 
setlocal 
set "sourcedir=c:\FILETEST" 
pushd %sourcedir% 
for /f "tokens=1,2,3,4*delims=-" %%a in (
'dir /b /a-d *-*--*-*--*.*' 
) do if "%%e" neq "" ( 
md "%%a-%%b" 
md "%%a-%%b/%%c-%%d" 
move "%%a-%%b--%%c-%%d--%%e" ".\%%a-%%b\%%c-%%d\" 
) 
popd 
goto :eof 

是我遇到的第一個問題是,我需要使用這兩個腳本來瀏覽所有文件,有時候它是一個命中和錯過。有沒有辦法將這兩個腳本與「if exists」語句結合起來?

第二個問題和更多的問題是目前的分隔符設置爲「 - 」,我可以添加另一個分隔符,例如, 「_」?

謝謝,請讓我知道如果有任何問題。

帕諾斯

回答

0
@ECHO OFF 
SETLOCAL ENABLEDELAYEDEXPANSION 
SET "sourcedir=U:\sourcedir" 
SET "destdir=U:\destdir" 

FOR /f "delims=" %%a IN (
'dir /b /a-d "%sourcedir%\*.doc" ' 
) DO (
SET "filename=%%~na" 
FOR /f "tokens=1-3delims=:" %%m IN ("!filename:--=:!") DO (
    IF "%%o"=="" (
    MD "%destdir%\%%m" 2>NUL 
    ECHO move "%sourcedir%\%%a" "%destdir%\%%m\" 
) ELSE (
    MD "%destdir%\%%m\%%n" 2>NUL 
    ECHO move "%sourcedir%\%%a" "%destdir%\%%m\%%n\" 
) 
) 
) 

GOTO :EOF 

你需要改變的sourcedirdestdir設置以適合你的情況。

我假設你所有的.doc文件都符合提供的掩碼。

dir命令會生成所有.doc文件的列表(顯然,如果需要,請提供不同的掩碼)。然後將每個名稱分配給%%a,名稱部分僅分配給filename

使用delayedexpansion,將每個--:(即不能在文件名中存在的字符),使用delims=:來tokenise到%%m..%%o。然後檢查是否存在第三個標記(因此第二層)並執行相應的創建和移動。

請注意,md one\two將創建one如果它不存在。 2>nul可以防止該目錄已存在的投訴。

所需的MOVE命令僅爲ECHO用於測試目的。 確認命令正確後,將ECHO(MOVE更改爲MOVE以實際移動文件。附加>nul以禁止報告消息(例如,1 file moved

至於delims問題,="之間的任何字符被定義爲分隔符;所有的排名均等。線路將被解釋爲delims TOKEN1 delims token2 ...其中delims串是(任意的(任何定界符的))

的序列
0

我想你可以使用一個更通用的方法:凡是文件名恰好是,改變"--"所有出現"\"讓您創建一個路徑(完整文件規範,如C:\path\to\name.ext)。然後從路徑名中提取父目錄,並相應地移動文件。

像這樣(未測試):

setlocal enabledelayedexpansion 
for %%a in (*) do (
    set "pathname=%%a" 
    set "pathname=!pathname:--=\!" 
    for %%b in ("!pathname!") do set "parent=%%~dpb" 
    md !parent! 
    move "%%a" "!pathname!" 
) 
相關問題