2016-09-27 16 views
2

まず、英語がうまくない場合は申し訳ありませんが、私はスペイン出身です。ファイルを管理するためのバッチファイルを少し作成する

私はINSTANCEというフォルダの中にたくさんのフォルダ(数十個)に広がったたくさんのファイル(数千)を持っています。ファイルタイプは2つしかありません(* .new、* .old)。すべてのフォルダに2つのフォルダがあります。私はそれぞれの* .newファイルを100個ごとに新しいフォルダの中に移動する必要があります。 * .oldファイルが存在する場合は、それらをすべて別のフォルダに移動します。私は手でそれをやってみましたが、数時間後にはこれが大きな仕事であることを認識していますので、バッチファイルですべてのフォルダを一度に実行するか、すべてのフォルダINSTANCEフォルダー内にあります。

混乱するように聞こえるかもしれませんが、私は最初の例を示し、それがどのようにしなければならないかの2番目の例を示します(100sの代わりに3sのグループを示します)。

前:

D:\[2016]\[01 JANUARY]\INSTANCE 
│ 
├───aaa 
│  01.new 
│  02.new 
│  03.new 
│  04.new 
│  05.new 
│  13.old 
│  14.old 
│ 
├───bbb 
│  01.new 
│  02.new 
│  03.new 
│  04.new 
│  05.new 
│  06.new 
│  07.new 
│  08.new 
│  13.old 
│  14.old 
│  15.old 
│ 
├───ccc 
│  01.new 
│  02.new 
│  03.new 
│  04.new 
│  05.new 
│ 
└───ddd 
     01.new 
     02.new 
     03.new 
     04.new 
     05.new 
     06.new 
     07.new 
     08.new 
     09.new 
     11.old 

後:

D:\[2016]\[01 JANUARY]\INSTANCE 
│ 
├───aaa 
│ ├───01 
│ │  01.new 
│ │  02.new 
│ │  03.new 
│ │ 
│ ├───02 
│ │  04.new 
│ │  05.new 
│ │ 
│ └───zz 
│   13.old 
│   14.old 
│ 
├───bbb 
│ ├───01 
│ │  01.new 
│ │  02.new 
│ │  03.new 
│ │ 
│ ├───02 
│ │  04.new 
│ │  05.new 
│ │  06.new 
│ │ 
│ ├───03 
│ │  07.new 
│ │  08.new 
│ │ 
│ └───zz 
│   13.old 
│   14.old 
│   15.old 
│ 
├───ccc 
│ ├───01 
│ │  01.new 
│ │  02.new 
│ │  03.new 
│ │ 
│ └───02 
│   04.new 
│   05.new 
│ 
└───ddd 
    ├───01 
    │  01.new 
    │  02.new 
    │  03.new 
    │ 
    ├───02 
    │  04.new 
    │  05.new 
    │  06.new 
    │ 
    ├───03 
    │  07.new 
    │  08.new 
    │  09.new 
    │ 
    └───zz 
      11.old 

要約:

Look inside INSTANCE 

    for every folder inside 

    if any *.old file exists create a folder called ZZ and move there all of them 

    Then 

    create folder 01 and move 100 of the *.new files 
    create folder 02 and move the next 100 
    create folder 03 and move the next 100 
    ... 

Until all the files have been moved 

検索する前に、どのように私はプログラマではないので、それが可能かどうかを知りたいと思っています。それは、私にとっては、一度だけのことなので、学習曲線です。私はいくつかのコマンド(MD、IF EXIST、MOVEなど)のいくつかを助けることができるいくつかのコマンドがあると読んでいますが、すべてを単一のバッチファイルで行うことはできません。

ありがとうございます。

+1

はい、可能です。今すぐあなたの検索を行うことができます。がんばろう。 –

+1

.newファイルの年代は重要ですか?または、100個の.newファイルをコピーしてコピーするだけです。あなたのファイルは本当に01,02,03,04という名前ですか? – SachaDee

+1

@Ken Whiteありがとうございます。私は今、ループでファイルを100でグループ化する方法を理解しようとしています。 –

答えて

2
@ECHO OFF 
SETLOCAL 
SET "sourcedir=U:\sourcedir\t w o\instance" 
SET /a filesperdir=3 
PUSHD "%sourcedir%" 

REM For each directory found in "sourcedir" 
FOR /f "delims=" %%a IN (
'dir /b /ad "*" ' 
) DO (
SET "dirname=%%a" 
REM initialise subdirectory counter and file counter 
SET /a subcount=0 
SET /a filecount=filesperdir 
REM scan for files "*.new" 
FOR /f "delims=" %%c IN (
    'dir /b /a-d ".\%%a\*.new" 2^>nul' 
) DO (
    REM name of file and move 
    SET "filename=%%c" 
    CALL :movenew 
) 
REM scan for files "*.old" 
FOR /f "delims=" %%c IN (
    'dir /b /a-d ".\%%a\*.old" 2^>nul' 
) DO (
    rem move to "zz" 
    MD ".\%%a\zz" >NUL 2>NUL 
    ECHO(MOVE ".\%%a\%%c" ".\%%a\zz\" 
) 
) 

popd 

GOTO :EOF 

:movenew 
REM one more file... 
SET /a filecount +=1 
REM filled this subdirectory? 
if %filecount% gtr %filesperdir% SET /a subcount+=1&SET /a filecount=1 
SET /a subnum=1000+subcount 
REM try to make subdirectory 
MD ".\%dirname%\%subnum:~-2%" >nul 2>nul 
ECHO(MOVE ".\%dirname%\%filename%" ".\%dirname%\%subnum:~-2%\" 
GOTO :eof 

sourcedirの設定を状況に合わせて変更する必要があります。

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

私はジョブの仕組みについてインラインでコメントしました。あなたはこのトリック(REMの代わりに::)がACODEブロック(文の括弧のシリーズ)内で動作していないため(多くの場合、迅速・ツー・タイプの代わりに使用)

ラフアウトラインをremない::を使用する必要があることに注意してください:reacサブディレクトリが見つかった場合は、サブディレクトリ数を0に、filecountをmaxに設定します。最初に.newファイルのサブディレクトリを処理し、次に.oldを処理します。 oldファイルの場合、処理は単純です。それらをサブディレクトリzzに移動するだけです。 newファイルの場合は、サブルーチンmovenewを実行します。

:movenewは、count-of-files-movedに1を加算し、結果が許容数より大きい場合は、サブディレクトリ数をインクリメントしてファイル数をリセットします。subcountから1000subnumは常に4桁であることを確実にする追加 -

次いで、サブディレクトリ名(文字列の最後の2文字)を算出するsubnumを使用します。 ディレクトリを作成し、ファイルを移動します。

ディレクトリがすでに存在する場合、mdはエラーメッセージを作成します。 2>nulは、このエラーメッセージを抑制します。 dirコマンド内の2^>nulは、目的のファイルタイプを含まないディレクトリに対しても同様の目的を果たします。キャレット^は、>が実行中のコマンドの一部であり、forではないことをプロセッサに伝えます。

+0

WOW!私はそれが私よりも少ない行であったが、理解するのがより複雑であることは驚きだ。私が必要としているところでは、「filesperdir」の値は100です.3という値を指定すると、* .newファイルのサブディレクトリ名は01から3ファイルごとに99に増加し、01で再び開始されます。私がよく理解すれば、名前は1000から始まると言いましたか?とにかく、私はdir(100 * 99)あたり10000個以上のファイルを持っているとは思わないので、 'filesperdir'の値を100に変更しても結果には影響しません。 –

+0

'filesperdir'を任意の値に設定できます。あなたの目的地のディレクトリ名は '01'〜' 99'であるので、移動するファイルが99個以上ある場合、次のディレクトリ名は(1000 + 100)= 1100(最後の2文字= '00')それ以降は(1000 + 101)= 1101(最後の2文字= '01')というようになります。 3桁のディレクトリ名を生成する場合は、 '%subnum:〜-2%'の代わりに '%subnum:〜-3%'を使用するか、そのまま残して、 'filesperdir'を設定して99個以下のディレクトリ作成されます。 – Magoo

+0

私は 'zz'ディレクトリの生成を修正しました。 NUL 2> NUL' – Magoo

2
@echo off 
setlocal EnableDelayedExpansion 

rem Look inside INSTANCE 
cd /D "D:\[2016]\[01 JANUARY]\INSTANCE" 

rem for every folder... 
for /D %%f in (*) do (
    rem ... inside 
    cd "%%f" 

    rem if any *.old file exists... 
    if exist *.old (
     rem ... create a folder called ZZ... 
     md ZZ 
     rem ... and move there all of them 
     move *.old ZZ 
    ) 

    rem Then, create folders with two-digits and move 100 *.new files to each one 
    set /A twoDigits=100, files=-1 
    for %%a in (*.new) do (
     set /A files+=1, filesMOD100=files%%100 
     rem Every 100 files, when the remainder of files/100 is zero... 
     if !filesMOD100! equ 0 (
     rem ... create a new two-digits folder 
     set /A twoDigits+=1 
     md !twoDigits:~-2! 
    ) 
     move "%%a" !twoDigits:~-2! 
    ) 

    rem Go back to original folder -INSTANCE- 
    cd .. 

) 
+0

@Magoo、WOWと同じです!これは最初の試行で動作し、私が心に持っていたのと同じように、分かりにくい部分があるようですが、将来必要な場合に備えて試していきます( 'filesMOD100'のように)。他の人を教える。 –

+0

_modulo operation_( 'set/A'コマンドの'% '演算子によって与えられる)は、整数除算の剰余です。例えば、「5 mod 2」は1であり、「9 mod 3」は0であり、 [このWikipediaの記事](https://en.wikipedia.org/wiki/Modulo_operation)を参照してください。 ¡Saludos des Mdexico! – Aacini

+0

すべての数学の授業を覚えておくと便利です。 Gracias por todo。 –

関連する問題