2017-09-13 12 views
1

ガイダンスが必要な箇所が2つあり、可能かどうかはわかりません。以下のコードは意図したとおりに動作しています。バッチファイルを使用してファイル名に基づいてフォルダとオプションのサブフォルダを作成する

@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 

私が午前最初の問題は、そのIでありますすべてのファイルを処理するために両方のスクリプトを使用する必要があり、時にはヒットとミスです。 2つのスクリプトをif ifステートメントと組み合わせる方法はありますか?

2番目の問題やその他の質問は、現在delimsが " - "に設定されています。別のデリムを追加することはできますか? "_"?

ご不明な点がありましたらお知らせください。

パノス

答えて

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 

:この(テストしていない)のような

何か。

あなたの.docファイルのすべてが提供されたマスクに適合しているとします。

dirコマンドは、すべての.docファイルのリストを生成します(必要に応じて、別のマスクを用意してください)。各名前は%%aに割り当てられ、名前部分はfilenameにのみ割り当てられます。

delayedexpansion使用して、各--:に(ファイル名には存在できない文字)に変換し、%%m..%%oにtokeniseするdelims=:を使用しています。次に、3番目のトークン(したがって2番目のレベル)が存在するかどうかを確認し、適切な作成と移動を実行します。

md one\twoは、まだ存在しない場合はoneを作成します。 2>nulは、ディレクトリが既に存在するという苦情を抑止します。

必要なMOVEコマンドは、テストのために単なるECHOです。 コマンドが正しいことを確認したら、ECHO(MOVEからMOVEに変更して、実際にファイルを移動します。 >nulを追加して、レポートメッセージを抑制します(例:1 file moved

delims問題として、="間の任意の文字を区切り文字として定義されます。すべて同じようにランク付けされます。ラインは、delimsTOKEN1 delims delims列が

((区切り文字のいずれか)のいずれか)のシーケンスである token2 ...と解釈されます
0

私はあなたがより一般的なアプローチ使用することができます考えています:filenameはパス名(なC:\path\to\name.extとして完全なファイル仕様)を作成するように、"--""\"へのすべての出現を変えることを起こるものは何でもします。次に、パス名から親ディレクトリを抽出し、それに応じてファイルを移動します。あなたは、あなたの状況に合わせてsourcedirdestdirの設定を変更する必要があります

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!" 
) 
関連する問題