0

したがって、次のような一連のファイルがあります。

Bob - Test Name - 1.txt
Bob - Test Name - 2.txt
Bob - Test Name - 3.txt
Sam- Foo Name - 1.txt
Sam- Foo Name - 2.txt
Sam- Foo Name - 3.txt
Phil - 1.txt
Phil - 2.txt
Phil - 3.txt
Phil 2 - 1.txt
Phil 2 - 2.txt
Phil 2 - 3.txt

簡単に言えば、パターンは次のようなものです。

[WHATEVER] - #.txt
[WHATEVER](space)-(space)(number).extension

私は次のことをしたいと思います:

  1. フォルダをスキャンする
  2. 何でもキャプチャします。上記の例では、キャプチャ:「Bob - テスト名」
  3. WHATEVER というフォルダを作成します。ここでは、「ボブ - テスト名」
  4. WHATEVER 文字列を持つすべてのファイルをフォルダーに移動します。
  5. すべてのファイルで 2 ~ 4 を繰り返します。

これまで、私が試みたすべてのことは失敗しました。トラブルシューティングの方法やバッチの動作を確認する方法がわからないため、風の中で撮影しています。

このシナリオにはさまざまなファイル タイプ (mp3 など) があるため、これを拡張子にとらわれないようにしたいと思います (バッチ ファイルの先頭に拡張子を設定します)。

4

3 に答える 3

1
@echo off &SETLOCAL
SET "startfolder=c:\test\test"

CD /d "%startfolder%"
FOR %%X IN (*.txt) DO (
    FOR /f "delims=" %%a IN ('echo(%%~NX^|sed -r "s/^(.*)\s-\s[0-9]+$/\1/"') DO (
    IF NOT EXIST "%%~a\" MD "%%~a"
    MOVE "%%~X" "%%~a"
    )
)

シード

于 2013-08-08T05:59:17.553 に答える
0

このコードは、 に一致するファイルで* - #.*機能します。#*(space)-(space)(space)-(space)(number).

SETLOCAL ENABLEDELAYEDEXPANSION
REM Call process for each file that match "name - number.extension"
FOR %%f IN ("* - *.*") DO CALL :process "" "%%f"
GOTO :EOF

REM Recursive function process: accepts two arguments: prefix and filepart
REM process checks if number part of supplied filename is a number.
REM prefix is string already checked but mismatched number. Example:
REM Call 1: "" "a - b - c - 1.ext" mismatch ("b - c - 1" is not a number)
REM Call 2: "a -" " b - c - 1.ext" mismatch ("c - 1" is not a number)
REM Call 3: "a - b -" " c - 1.ext" match ("1" is a number)
:process
REM Break filepart at first "-"
FOR /F "TOKENS=1,* DELIMS=-" %%i IN (%2) DO (
    REM If after "-" is empty, file mismatch (something like "abc.ext-")
    IF "%%j" == "" GOTO :EOF
    REM Break part after "-" at first "."
    FOR /F "TOKENS=1,* DELIMS=." %%n IN ("%%j") DO (
        REM Multiply part before "." by 1. If part is not number, will evaluate to 0.
        SET /A "number=1*%%n"
        REM Check if rebuilt part afte "-" match using parsed number
        IF "%%j" == " !number!.%%o" (
            REM Matched, so do whatever is needed
            ECHO Moving "%~1%~2" to "%~1%%i"...
            IF NOT EXIST "%~1%%i" MD "%~1%%i"
            REM MOVE "%~1%~2" "%~1%%i"
            REM Exit function
            GOTO :EOF
        )

    )
    REM File part didn't match, so recall process shifting part before "-" to prefix
    REM and using part after "-" as filepart.
    CALL :process "%~1%%i-" "%%j"
)

たとえば、の代わりにname1 - 1. name2 - 2.txtフォルダを作成すると、リークする可能性があります。name1name1 - 1. name2

編集:コメントを追加しました。誤字脱字修正CALL :process "%~1%%i-" "%%j"

于 2013-08-08T09:38:32.893 に答える
0

あなたが何を望んでいるのか完全にはわかりませんが、これでうまくいくと思います:

setlocal enabledelayedexpansion
cd C:\...[path to folder]
set /a count=0
for /r "delims=-" %%a in (*) do (
set /a count=!count!+1
for /l %%z in (1,1,!count!) do (
if %%a equ !%%z! ( move %%a C:\...[out put folder collection]\!%%z!\%%a%%b
) else ( set !count!=%%a)
)
)

出力

Folder Collection
 > 1
    >> name - 1.txt
    >> name - 2.txt
    >> name - 3.txt
 > 2
    >> name - 1.txt
    >> name - 2.txt
    >> name - 3.txt
 > 3
    >> name - 1.txt
    >> name - 2.txt
    >> name - 3.txt

私はそれがうまくいくと確信しています。テストしていないので、エラーを見つけたり取得したりした場合は教えてください。

注: これは、ファイル名に 1 つの「-」のみを受け入れます。複数あると、拡張子が除外されます。また、指定された拡張機能では機能しませんでした。今回forfilesは拡張子を指定できる場所を使用して、別の答えを出します。

モナ

于 2013-08-08T02:07:57.323 に答える