Показать полную графическую версию : [решено] Копирование файла в папки по списку
Доброго дня. Есть такая задача.
файл 121615.xls нужно скопировать в папки, список которых хранится в файле list.txt . Папки находятся на одном логическом диске, но разбросаны по другим папкам. Есть ли вообще возможность такое хоть как-то автоматизировать?
для запуска из командной строки:
for /f %i in (destinations.txt) do @copy "f:\ile\location\121615.xls" %i
для батника %i заменить на %%i
для запуска из командной строки:
Код:
for /f %i in (destinations.txt) do @copy "f:\ile\location\121615.xls" %i
для батника %i заменить на %%i »
Я так понимаю, тут подразумевается, что в destinations.txt папки указаны с маршрутами. Но если я не знаю, где эта папка лежит, и нужно, чтобы система её сама нашла? В моем файле только имена папок указаны.
Bobis, так не пойдет, папки, пожалуй, найти можно, но где гарантия что это именно те папки, в которые нужно файлы распихать? Допустим в списке указана папка system кроме того что папка с таким названием предположительно (но это не точно) существует в целевом пути она может располагаться и в Windows, а совать туда что попало есть весьма не комильфо. Нужны какие-то ограничивающие условия, например где именно такие папки нужно искать. И желательно не использовать маски ограничивающиеся буквой диска, ибо в таком случае, в зависимости от размера и заполненности диска, конечно, работа батника может затянуться как минимум надолго.
Elven,
Все искомые папки находятся по адресу C:\Prepare\ . И вот в этой папке нужно искать те, что будут в текстовом файле. По результату поиска в найденные папки скопировать в них файл.
ну тогда приблизительно так (опять же прямо из командной строки):
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
для батника % заменить на %%
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
При этом результат "Файл не найден."
Хотя вроде маршруты все правильные.
Elven, Поковырял еще, понял, что не копирует, потому что имена искомых папок кирилицей и длинные (полное ФИО). Может проблема с кодировкой? Или не полное сравнение проводит ?
если есть кириллица то батник должен быть в 866 кодировке. штатный виндовый блокнот ее не умеет (меня кстати всегда интересовало почему), поэтому лучше воспользоваться сторонним редактором, например npp (https://notepad-plus-plus.org/)
Elven, То есть его написать нужно именно в этой кодировке? Я пользовался Far Manager. Игрался кодировками батников - не помогло (((. Что я не так делаю?
Вот что у меня получилось.
@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"
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? Батник в предыдущем посте исправил тоже
megaloman,
На всякий случай: не называйте свои исполнимые файлы именами команд в CMD: copy.bat, например. Возможны коллизии: что будет вызывать код - команду copy или файл copy.bat? »
Спасибо, я как-то не подумал от этом.
Файл работает. Проверил на рабочих папках - из 2000 папок находит нужные из списка, раскладывает туда файл. Даже учитывая то ,что в названии папок присутствуют украинские символы.
СПАСИБО большое всем, кто откликнулся. Тему можно считать закрытой.
Спасибо, я как-то не подумал от этом. »
Почти каждый из нас проходит через это :).
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.