Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Копирование файла в папки по списку (http://forum.oszone.net/showthread.php?t=341402)

Bobis 16-07-2019 12:05 2880016

Копирование файла в папки по списку
 
Доброго дня. Есть такая задача.

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

Elven 16-07-2019 12:18 2880019

для запуска из командной строки:
Код:

for /f %i in (destinations.txt) do @copy "f:\ile\location\121615.xls" %i
для батника %i заменить на %%i

Bobis 16-07-2019 12:30 2880021

Цитата:

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


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

Elven 16-07-2019 12:40 2880025

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

Bobis 16-07-2019 12:53 2880028

Elven,

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

Elven 16-07-2019 13:10 2880032

ну тогда приблизительно так (опять же прямо из командной строки):
Код:

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 2880039

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 2880056

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

Elven 16-07-2019 15:28 2880058

если есть кириллица то батник должен быть в 866 кодировке. штатный виндовый блокнот ее не умеет (меня кстати всегда интересовало почему), поэтому лучше воспользоваться сторонним редактором, например npp

Bobis 16-07-2019 15:41 2880061

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

mwz 16-07-2019 16:06 2880064

Цитата:

Цитата Bobis
Вот что у меня получилось.
@echo off »

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

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

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

megaloman 16-07-2019 17:46 2880098

Код:

@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.txt
Код:

In
Out
Офигенная фигня

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

Bobis 17-07-2019 02:12 2880166

megaloman,

Все по инструкции написал. FAR на пару секунд зависает на черном экране, потом результат нулевой. СКРИН

На всякий случай СКРИН_2 папок и list.txt и сам КОД

megaloman 17-07-2019 07:09 2880177

Вложений: 1
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 2880189

megaloman,
Цитата:

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

Спасибо, я как-то не подумал от этом.

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

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

Iska 17-07-2019 17:24 2880287

Цитата:

Цитата Bobis
Спасибо, я как-то не подумал от этом. »

Почти каждый из нас проходит через это :).

Sasha_vinni 30-01-2025 16:14 3035636

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

megaloman 30-01-2025 21:04 3035655

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

Здесь батник настроен для обработки файлов в той же папке, что и батник. Но возможен вариант явного указания рабочей папки.
Цитата:

Цитата Sasha_vinni
и скопировать туда файлы из списка этих текстовых файлов »

Сейчас настройка на копирование. Второй вариант - перемещение файлов.


Время: 21:54.

Время: 21:54.
© OSzone.net 2001-