Пакетный файл для создания папки и перемещения файла в папке - PullRequest
0 голосов
/ 12 октября 2018

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

Файлы jpeg для каждого содержимого помечены следующим образом:

6c82c0239f6eb839-1
6c82c0239f6eb839-2
all the way to 120

Имя файла для каждого содержимого различно

a82384e2c46ba4af-1
a82384e2c46ba4af-2
etc.

Все они будут извлечены в одну папку.

Поэтому мне в основном нужен командный файл, который будет создавать папки на основе имени содержимого без тире и номера и перемещать все 120 jpeg в папке с именем содержимого.

Например:
Создать папку с именем 6c82c0239f6eb839 и
переместить 6c82c0239f6eb839-1 в 6c82c0239f6eb839-120 в созданную папку.

Я увидел другую ветку со следующим командным файлом.Это почти то, что я хочу, но имя папки длиной всего 3 символа, и файлы копируются во вновь созданные папки, а не перемещаются.

@echo off
SetLocal EnableDelayedExpansion
for /F "delims=" %%a in ('dir /b *.jpeg') do (
  set Name=%%a
  set Folder=!Name:~0,3!
  xcopy  /y "%%a" !Folder!\
)

Может ли кто-нибудь изменить это так, чтобы он отображал полное имя файла без тире и номера для папок и перемещал файлы в соответствующие папки вместо копии?

Спасибо

Ответы [ 3 ]

0 голосов
/ 12 октября 2018
@echo off
setlocal

@rem Get each jpeg file.
for /F "delims=" %%A in ('2^>nul dir /b *.jpeg') do (

    rem Get filename as token before the dash.
    for /f "delims=-" %%B in ("%%~A") do (

        rem Make dir if needed.
        if not exist "%%~B" md "%%~B"

        rem Check if isdir.
        2>nul pushd "%%~B" && popd

        if errorlevel 1 (
            >&2 echo Failed isdir "%%~B".
        ) else (

            rem Do the move operation.
            >nul move /y "%%~A" "%%~B"

            if errorlevel 1 (
                >&2 echo Failed move "%%~A" to "%%~B"
            )
        )
    )
)

exit /b %errorlevel%

Код хорошо помечен, поэтому, если вы хотите понять оцененный код, изменив @echo off на @echo on.Использование %errorlevel% после exit /b не требуется, однако даст вам знать, что такое errorlevel, когда используется @echo on.

pushd проверяет каталог (даже если онэто символическая ссылка).errorlevel проверяется, чтобы решить, выводить ли сообщение об ошибке или делать move.

Поскольку переменные цикла for используются напрямую, использование enabledelayedexpansion не требуется.

Многие команды поддерживают аргумент /?, чтобы получить справку о команде.то есть move /?.

0 голосов
/ 13 октября 2018

Прежде всего, я хотел бы извиниться за мои манеры относительно моего начального поста.

Ответ micheal_heath решил мою проблему.

Кроме того, мне довелось найти это сообщение пользователя Salmon Trout с другого сайта, который также работал.

Пакетный файл для создания папок с частью имени файла и последующего копирования файлов

@echo off
setlocal enabledelayedexpansion
for %%A in (*.psd *.jpg) do (
   echo file found  %%A
   for /f "delims=" %%B in ("%%A") do set fname=%%~nB
   for /f "delims=" %%C in ("%%A") do set fextn=%%~xC
   for /f "tokens=1* delims=_" %%D in ("!fname!") do set folname=%%D
   echo folder name !folname!
   if not exist "!folname!" (
      echo Folder !folname! does not exist, creating
      md "!folname!"
   ) else (
      echo Folder !folname! exists
   )
   echo Moving file %%A to folder !folname!
   move "%%A" "!folname!"
   )
echo Finished
pause

Я только что изменил следующую строку, удалите перенос и цифры для создания папокдля имени файла правильно.

for /f "tokens=1* delims=-***" %%D in ("!fname!") do set folname=%%D

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

0 голосов
/ 12 октября 2018

Если вы только пытаетесь скопировать правильный jpeg в правильную папку, вы можете сделать это:

@echo off
SetLocal EnableDelayedExpansion
CD <CORRECT ROOT PATH>
for /F "delims=" %%a in ('dir /b *.jpeg') do (
  set Name=%%a
  REM I presume all the files have 16 characters before the dash
  set Folder=!Name:~0,16!
  IF NOT EXIST !Folder! MKDIR !FOLDER!
xcopy  /y "%%a" !Folder!\
)

Я не смог проверить.

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