PDA

Показать полную графическую версию : [решено] Копирование файла в папки по списку


Bobis
16-07-2019, 12:05
Доброго дня. Есть такая задача.

файл 121615.xls нужно скопировать в папки, список которых хранится в файле list.txt . Папки находятся на одном логическом диске, но разбросаны по другим папкам. Есть ли вообще возможность такое хоть как-то автоматизировать?

Elven
16-07-2019, 12:18
для запуска из командной строки:
for /f %i in (destinations.txt) do @copy "f:\ile\location\121615.xls" %i
для батника %i заменить на %%i

Bobis
16-07-2019, 12:30
для запуска из командной строки:
Код:
for /f %i in (destinations.txt) do @copy "f:\ile\location\121615.xls" %i
для батника %i заменить на %%i »


Я так понимаю, тут подразумевается, что в destinations.txt папки указаны с маршрутами. Но если я не знаю, где эта папка лежит, и нужно, чтобы система её сама нашла? В моем файле только имена папок указаны.

Elven
16-07-2019, 12:40
Bobis, так не пойдет, папки, пожалуй, найти можно, но где гарантия что это именно те папки, в которые нужно файлы распихать? Допустим в списке указана папка system кроме того что папка с таким названием предположительно (но это не точно) существует в целевом пути она может располагаться и в Windows, а совать туда что попало есть весьма не комильфо. Нужны какие-то ограничивающие условия, например где именно такие папки нужно искать. И желательно не использовать маски ограничивающиеся буквой диска, ибо в таком случае, в зависимости от размера и заполненности диска, конечно, работа батника может затянуться как минимум надолго.

Bobis
16-07-2019, 12:53
Elven,

Все искомые папки находятся по адресу C:\Prepare\ . И вот в этой папке нужно искать те, что будут в текстовом файле. По результату поиска в найденные папки скопировать в них файл.

Elven
16-07-2019, 13:10
ну тогда приблизительно так (опять же прямо из командной строки):
pushd "C:\Prepare\" && (for /f %i in (destinations.txt) do (for /f %j in ('dir /B /S %i?') do @copy "f:\ile\location\121615.xls" %~fj)) && popd
для батника % заменить на %%

Bobis
16-07-2019, 13:46
Elven,
Вот что у меня получилось.
@echo off
pushd "C:\Prepare\" && (for /f %%i in (C:\TEMP\destinations.txt) do (for /f %%j in ('dir /B /S %%i?') do @copy "C:\TEMP\121512_short.xlsx" %%~fj)) && popd

При этом результат "Файл не найден."

Хотя вроде маршруты все правильные.

Bobis
16-07-2019, 15:20
Elven, Поковырял еще, понял, что не копирует, потому что имена искомых папок кирилицей и длинные (полное ФИО). Может проблема с кодировкой? Или не полное сравнение проводит ?

Elven
16-07-2019, 15:28
если есть кириллица то батник должен быть в 866 кодировке. штатный виндовый блокнот ее не умеет (меня кстати всегда интересовало почему), поэтому лучше воспользоваться сторонним редактором, например npp (https://notepad-plus-plus.org/)

Bobis
16-07-2019, 15:41
Elven, То есть его написать нужно именно в этой кодировке? Я пользовался Far Manager. Игрался кодировками батников - не помогло (((. Что я не так делаю?

mwz
16-07-2019, 16:06
Вот что у меня получилось.
@echo off »

На время отладки уберите эту строку и смотрите, где появляются проблемы. Запускать батник из окна CMD. Строка нужна лишь для окончательно отлаженных скриптов — а в процессе отладки противопоказана, поскольку заставляет тыкаться как слепому котёнку вместо того, чтобы или прочитать причину ошибки в явном виде, или увидеть её зрительно (типа отсутствия кавычек при развёртывании переменных, содержащих пробелы).

А то и ставьте команду
pause
после каждой строки и анализируйте, где что пошло не так, как ожидалось.

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

megaloman
16-07-2019, 17:46
@Echo Off
cls
>nul Chcp 1251
Set "FileIn=Z:\Где размножаемый файл\121615.xls"
Set "BoxOut=Z:\Папка с искомыми подпапками"
Set "Reestr=Z:\Папка с реестром\list.txt"

FOR /F "usebackq delims=" %%f IN (`2^>nul More "%Reestr%"`) DO Set "@@%%f=Copy "%FileIn%""

FOR /F "usebackq delims=" %%d IN (`2^>nul Dir /B /A:D /S "%BoxOut%\"`) DO (
Call %%@@%%~nxd%% "%%d\" >nul 2>&1 &&Call Echo %%@@%%~nxd%% "%%d\"
)
Pause
Exit /B

файл list.txtIn
Out
Офигенная фигня

Специально назвал папки кириллицей. Батник и list.txt сохранить в 1251 кодировке (например, стандартный notepad.exe)
Кстати, при желании можно размножить несколько файлов по общей маске, например,
Set "FileIn=Z:\Где размножаемый файл\*.xls"

Bobis
17-07-2019, 02:12
megaloman,

Все по инструкции написал. FAR на пару секунд зависает на черном экране, потом результат нулевой. СКРИН (https://ibb.co/R020SFP)

На всякий случай СКРИН_2 (https://ibb.co/ZSfF5h6) папок и list.txt и сам КОД (https://ibb.co/KNr2QrF)

megaloman
17-07-2019, 07:09
Bobis, @Echo Off
cls
>nul Chcp 1251
Set "FileIn=D:\Temp\1.txt"
Set "BoxOut=D:\Temp\tmp"
Set "Reestr=D:\Temp\list.txt"

If Not Exist "%FileIn%" (Echo "%FileIn%" Not Exist &Pause &Exit /B 2)
If Not Exist "%BoxOut%\" (Echo "%BoxOut%" Not Exist &Pause &Exit /B 2)
If Not Exist "%Reestr%" (Echo "%Reestr%" Not Exist &Pause &Exit /B 2)

>"%~dpnx0.txt" More "%~dpnx0"
>>"%~dpnx0.txt" More "%Reestr%"
>>"%~dpnx0.txt" Dir "%BoxOut%\" /S /B /A:D

FOR /F "usebackq delims=" %%f IN (`2^>nul More "%Reestr%"`) DO Set "@@%%f=Copy "%FileIn%""

FOR /F "usebackq delims=" %%d IN (`2^>nul Dir /B /A:D /S "%BoxOut%\"`) DO (
Call %%@@%%~nxd%% "%%d\" >nul 2>&1 &&Call Echo %%@@%%~nxd%% "%%d\"
)
Pause
Exit /B
Выделенные строки отладочные, они делают текстовый файл рядом с батником, если батник не отработает, приложите его к сообщению. В дальнейшем эти строки можно удалить
Прилагаю заархивированную папку Temp co всем хозяйством, включая батник.
На всякий случай: не называйте свои исполнимые файлы именами команд в CMD: copy.bat, например. Возможны коллизии: что будет вызывать код - команду copy или файл copy.bat? Батник в предыдущем посте исправил тоже

Bobis
17-07-2019, 09:48
megaloman,
На всякий случай: не называйте свои исполнимые файлы именами команд в CMD: copy.bat, например. Возможны коллизии: что будет вызывать код - команду copy или файл copy.bat? »
Спасибо, я как-то не подумал от этом.

Файл работает. Проверил на рабочих папках - из 2000 папок находит нужные из списка, раскладывает туда файл. Даже учитывая то ,что в названии папок присутствуют украинские символы.

СПАСИБО большое всем, кто откликнулся. Тему можно считать закрытой.

Iska
17-07-2019, 17:24
Спасибо, я как-то не подумал от этом. »
Почти каждый из нас проходит через это :).

Sasha_vinni
30-01-2025, 16:14
Помогите написать батник.
Есть файлы, к примру "Семенов.txt", "Иванов.txt" в которых хранятся имена файлов в столбец без расширения и путей.
Они находятся в той же папке где есть те файлы что по списку.
Задача, создать папку с именем файла ("Семенов", "Иванов"...) и скопировать туда файлы из списка этих текстовых файлов.
Заранее спасибо!

megaloman
30-01-2025, 21:04
Sasha_vinni, Вы не указали кодировку текстовых файлов "Семенов.txt", "Иванов.txt" . Вы не уточнили, есть ли другие текстовые файлы, не содержащие списки. В предположении, что кодировка файлов 1251 и иные txt отсутствуют
@Echo Off &Cls
>nul Chcp 1251
rem Set "BoxIn=Z:\Box_In"
Set "BoxIn=%~dp0"

Pushd "%BoxIn%"||(Echo Folder "%BoxIn%" not found &Pause &Exit /B 2)
FOR %%f IN ("*.txt") DO (
2>nul Md "%%~nf"
For /f "usebackq delims=" %%n IN (`2^>nul type "%%f"`) Do >nul Copy "%%n.*" "%%~nf\"
rem For /f "usebackq delims=" %%n IN (`2^>nul type "%%f"`) Do >nul Move "%%n.*" "%%~nf\"
)
Pause
Exit /B
Здесь батник настроен для обработки файлов в той же папке, что и батник. Но возможен вариант явного указания рабочей папки.и скопировать туда файлы из списка этих текстовых файлов »Сейчас настройка на копирование. Второй вариант - перемещение файлов.




© OSzone.net 2001-2012