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

Я пытаюсь переместить файлы в каталоги, имя которых совпадает с именем файла, за исключением расширения и добавить слово footage в конец имени каталога:

Например:

Файл Graduation 2014.mkv должен быть перемещен в папку Graduation 2014 Footage Файл Graduation 2015.mkv должен быть перемещен в папку Graduation 2015 Footage и т. Д.

Вот что я пробовал:

@echo off
 for %%A in (*.mkv) do (
   move "%%A" "%%~nA:~0,-8"
 )
 pause`

bu Я получаю следующую ошибку:

Неверный синтаксис имени файла, имени каталога или метки тома. *

Ответы [ 3 ]

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

Это простое решение работает для меня.

Вот имена папок в качестве примера:

File1_ext
12345_5678
43226343_12
224356434
File2_ext
File3_ext
Folder_exc
File4_ext
Ect-Hello

Дерево вывода:

C:.
│   Move.bat
│
├───12345_5678
├───224356434
├───43226343_12
├───Ect-Hello
├───File1_ext
│       File1.mkv
│
├───File2_ext
│       File2.mkv
│
├───File3_ext
│       File3.mkv
│
├───File4_ext
│       File4.mkv
│
└───Folder_exc

Пакетный сценарий:

@echo off
@setlocal enabledelayedexpansion
Rem | Get File Name
FOR %%A IN (*.mkv) do (
    Set "FileExt=%%~xA"
    Set "FileName=%%~nA"

    Rem | Get Folder Name
    for /f "tokens=*" %%B in ('dir /b /a:d^| find /i "!FileName!"') do (

        Move "!FileName!!FileExt!" "%~dp0%%B"
    )
)
pause
0 голосов
/ 18 февраля 2019

Я бы предложил сделать это немного другим способом.Герхард Барнард и Джон Кенс предложили сделать простой for цикл по всем *.mkv файлам.Тем не менее, это не будет работать, если есть скрытые файлы.У вас может быть альтернативное чрезвычайно общее решение:

@echo off

for /F "delims=" %%A IN ('dir /b /a-d "C:\some\path\to\mkvs" *.mkv') do (
    attrib -h "%%~fA" >nul 2>&1
    if not exist "%%~dpnA Footage\" md "%%~dpnA"
    move "%%~fA" "%%~dpnA Footage\"
)

, которое, безусловно, более безопасно, поскольку мы используем полные пути.if exist может быть здесь бессмысленным, потому что вы можете сделать:

@echo off

for /F "delims=" %%A IN ('dir /b /a-d "C:\some\path\to\mkvs" *.mkv') do (
    attrib -h "%%~fA" >nul 2>&1
    md "%%~dpnA" >nul 2>&1
    move "%%~fA" "%%~dpnA Footage\"
)

, что означает перенаправить любой вывод (ошибки и STDOUT) на nul, поэтому скрывайте их.

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

Я публикую этот ответ только на основе только этой строки в вашем вопросе.

Попытка переместить файлы (.mkv) в папки с одинаковыми именами, кроме последних 8 символов.

Полагаю, вы должны были просто сделать это и позволить сценарию создать папку для вас:

@echo off
for %%i in (*.mkv) do (
   mkdir "%%~ni Footage">nul 2>&1
   move "%%i"  "%%~ni Footage"
)
pause

или, если вы настаиваете на том, чтобы сценарий не создавал папку, просто сделайте:

@for %%i in (*.mkv) do @move "%%i"  "%%~ni Footage"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...