Пакетный файл для перемещения файлов в папки на основе части их имени - PullRequest
0 голосов
/ 26 февраля 2019

Я ищу одно решение, которое поможет мне переместить файлы в папки с похожим именем.

У меня есть такие имена файлов, как TEST1_2018P2.xlsx, TEST2_2018P2.xslx и т. Д.

ИУ меня есть папки с именами TEST1_City1, TEST2 City2 ...

Мне нужно переместить файл TEST1_2018P2.xlsx в папку TEST1_City1, TEST2_2018P2.xslx в TEST2 City2 и т. Д.

Как я могу это сделать?

Вот мой последний код, который также не работает.

@ECHO OFF
SETLOCAL
SET "sourcedir=my_folder"
SET "destdir=my_folder"
FOR /f "delims=" %%a IN ( 'dir /b /a-d "%sourcedir%\*.xlsx" ' ) DO (
    FOR /f "tokens=1delims=" %%b IN ("%%a") DO (
        FOR /f "delims=" %%d IN ( 'dir /b /ad "%destdir%\*%%b*" ' ) DO (
            ECHO(MOVE "%%a" "%destdir%\%%d\"
        )
    )
)
GOTO :EOF

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Я не уверен в вашей точной задаче, поэтому этот сравнительно простой пример должен переместить любой файл .xlsx в первый существующий каталог, имя которого соответствует части имени файла до подчеркивания плюс пробел.

Отрегулируйте значения в строках 2 и 3 в соответствии с вашими действительными спецификациями каталога, (без обратной косой черты) .

@Echo Off
Set "SourceDir=my_folder"
Set "DestDir=my_folder"
For /F Delims^=^ EOL^= %%A In ('Dir /B/A-D-L "%SourceDir%\*_*.xlsx" 2^>Nul'
) Do Call :Sub "%%A"
GoTo :EOF

:Sub
Set "DirName=%~1"
Set "DirName=%DirName:_="&:"%"
For /F Delims^=^ EOL^= %%A In ('Dir /B/AD-L "%DestDir%\%DirName% *" 2^>Nul'
) Do If Exist "%~1" Move /Y "%~1" "%%A" 2>Nul
Exit /B

Не было разработанобыть наиболее эффективным способом выполнения задачи!

0 голосов
/ 26 февраля 2019

Предполагая, что фактический текст TEST1 не содержит любых _ символов, вы можете использовать:

@echo off
setlocal EnableDelayedExpansion

cd /d "your_folder"
for /F "delims= eol=" %%A IN ('dir /B /A-D "TEST*_2018P2.xlsx"') do (
    for /F "tokens=1 delims=_" %%B IN ("%%A") do (
        rem Define some important variables:
        set "token_1=%%B"
        set "num_test=!token_1:~-1!"
        set "foldername=!token_1!_City!num_test!"
        md "!foldername!\" >nul 2>&1
        move "%%~fA" "!foldername!\"
    )
)

Позвольте мне объяснить мой код:

  • Первый цикл for /F используется для поиска всех необходимых вам файлов (TEST*_2018P2.xlsx) , исключая все каталоги (/A-D) и заголовки.Используются опции delims= и eol=: цикл по всей строке без пропуска строк, начинающихся с ;.
  • Второй цикл for /F используется для получения первого токена выхода первогопетля (IN ("%%A")).
    • Первый токен устанавливается в переменную token_1, а затем вычитает из него последнюю цифру / букву, устанавливая его в переменную num_test.
    • Фольдерное имя устанавливается, поскольку оно используется двавремя, действительно трудно понять этот код, не устанавливая его в переменной.Фактически он задается с помощью переменных token_1 (TESTn), _City и n (число).
    • Папка создается с таким именем.И STDIN, и STDERR перенаправляются на nul.Это случается не для многих обработанных if exist операторов.Текущий файл (%%~fA; полный путь) перемещен в эту папку.

Не забудьте заменить "your_folder" на вашу фактическую папку!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...