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

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

sharky lions 07-04-2011 15:34 1653085

обработка bat-ником списков из txt-файла
 
задача:
Дано:
скрипт, копирующий файлы из папки orig в папки test1, test2, test3 и т.д.

Цитата:

copy C:\Users\user\Desktop\Orig\*.* C:\Users\user\Desktop\test1 /y
copy C:\Users\user\Desktop\Orig\*.* C:\Users\user\Desktop\test2 /y
...
Требуется:
брать строку адреса для копирования из файла txt (пусть будет copy_to.txt)
т.к. приведён тестовый батник, в реале требуется копировать в n-ное количество мест,
адреса которых не подчинятся столь строгой логике, т.е. нет возможности применить маску...

структура списка подразумевается построчная (один путь = одна строка) возможен замыкающий элемент списка типа "end" для завершения цикла

Цитата:

C:\Users\user\Desktop\test1
C:\Users\user\Desktop\test2
...
D:\*\*\*\testn
end
заранее огромное спасибо!



и ещё один вопрос, как получить список тех самых путей в ТХТ файл? если известно что у них есть одна общая особенность - подпапка с одинаковым названием (решение с привязкой батника к названию папки сразу, не катит - требуется высокоинтеллектуальная обработка путей, т.к. не все из них должны быть "отоварены")

в принципе, последнюю задачу можно свести к обработке группы ярлыков в отдельной папке, получить данную группу ярлыков очень просто с помощью встроенной функции поиска и отправки ярлыков на рабочий стол ))) задача остаётся открытой для случаев, когда список ярлыков перестаёт помещаться на рабочем столе )))


____________________________________________________________________________________________________ ________
решение для задачи №1
Цитата:

Цитата gora
Код:

@Echo Off
:: Файл-список. Список директорий без завершающих слешей.
:: Если в списке используется кириллица, то кодировка файл-списка должна быть DOS (866)
Set filelist=e:\Temp 1\copy_to.txt
:: Исходная папка
Set folder=C:\Users\user\Desktop\Orig
For /F "tokens=* usebackq" %%i In ("%filelist%") Do xCopy "%folder%\*" "%%i" /Y /I >Nul

»

решение для задачи №2

Цитата:

Цитата amel27
Код:

dir/s/b/ad "c:\*папка"|findstr/ie "\\папка">file.txt
»


HellWolf06 07-04-2011 17:52 1653186

Подсказка: тебе нужно использовать call :read_settings
и создать функцию
:read_settings

set SETTINGSFILE=%1

rem Проверка существования файла
if not exist %SETTINGSFILE% (
echo FAIL: Файл с настройками отсутствует
exit /b 1
)

rem Обработка файла c настройками
rem Здесь:
rem eol=# указывает на то, что содержимое строки начиная с символа #
rem и до ее конца может быть пропущено как комментарий.
rem
rem delims== указывает, что разделителем значений является символ =
rem
rem tokens=1,2 приводит к тому, что в переменную %%i будет занесен первый
rem токен, а в %%j - второй.
rem

for /f "eol=# delims== tokens=1,2" %%i in (%SETTINGSFILE%) do (
rem В переменной i - ключ
rem В переменной j - значение
rem Мы транслируем это в переменные окружения
set %%i=%%j
)

exit /b 0

sharky lions 08-04-2011 02:10 1653506

HellWolf06, спасибо конечно за веру в меня ))) но я умею только VBA и то на уровне создания активных кнопочек в экселе, обладающих весьма ограниченным функционалом ) примерно 60% написанного впитал, но для чего именно это нужно и к какой части вопроса моего это относится... могу предположить что к последнему... но для меня нет очевидных моментов с выводом в файл, например... это пожалуй самая моя больная тема т.к. я это так и не выяснил для себя даже в VBA ))) (т.е. как работать с внешними данными)

поэтому просьба считать меня совсем тупым и плясать от того, что написав выше означенные скрипты я выжал максимум из своих возможностей ))) /грубо говоря умею юзать прямые функции типа copy и start/

gora 08-04-2011 11:41 1653718

Цитата:

Цитата sharky lions
скрипт, копирующий файлы из папки orig в папки test1, test2, test3 и т.д. »

Попробуйте так:
Код:

@Echo Off
:: Файл-список. Список директорий без завершающих слешей.
:: Если в списке используется кириллица, то кодировка файл-списка должна быть DOS (866)
Set filelist=e:\Temp 1\copy_to.txt
:: Исходная папка
Set folder=C:\Users\user\Desktop\Orig

For /F "tokens=* usebackq" %%i In ("%filelist%") Do xCopy "%folder%\*" "%%i" /Y /I >Nul


sharky lions 10-04-2011 01:03 1655012

gora, не знаю других слов благодарности кроме "ОГРОМНОЕ СПАСИБО!" но их явно не достаточно )))
скрипт работает на ура ))) пояснения к коду максимально доходчивые для начинающих, за что, отдельный респект )))

для перекодировки в "dos 866", юзал "dcd"... (на случай если под рукой у кого-то не окажется другого перекодировщика, их навалом)

sharky lions 11-04-2011 00:51 1655572

пока решена только первая часть задачи...

gora 11-04-2011 08:20 1655652

Цитата:

Цитата sharky lions
как получить список тех самых путей в ТХТ файл?
1 если известно что у них есть одна общая особенность - подпапка с одинаковым названием
2 (решение с привязкой батника к названию папки сразу, не катит -
3 требуется высокоинтеллектуальная обработка путей, »

Вторая часть задачи плохо сформулирована. Нет ни каких разъяснений, что, куда и насколько "высокоинтеллектуально" нужно записать!? :dont-know
Про ярлыки идея вообще непонятна, да и работать с ними (создавать, изменять и т.п.) из бат файла, без сторонних утилит, не получится.

Попробуйте четко сформулировать задачу, не скупясь на подробности и примеры, ибо, правильно сформулированная задача - это половина ее решения.

HellWolf06 11-04-2011 14:12 1655821

sharky lions,
я тоже знаю VBScript и batch, но с той функцией которую я тебе дал и сам не разобрался)

sharky lions 13-04-2011 01:44 1657032

в общем, надо применить цикл FOR с ниже обозначенным набором операторов

Цитата:

%~dp$PATH:I - проводится поиск по каталогам, заданным в переменной
среды PATH, и переменная %I заменяется на имя диска
и путь к первому найденному файлу.

к папке с названием "DIR_NAME"

с создать файл "DIR_PATH.txt" в котором построчно перечисляются найденные значения переменной %I в формате: C:\***\DIR_NAME
где *** означает любое количество каталогов(директорий) в пути до искомой директории "DIR_NAME"


при этом желательно чтобы "DIR_PATH.txt" был в UNICODE, если это возможно, конечно...

amel27 13-04-2011 09:04 1657112

Цитата:

Цитата sharky lions
заменяется на имя диска
и путь к первому найденному файлу »

т.е. для заявленной задачи перебора ВСЕХ подходящих под условие папок эта фича не подходит - проще перебрать и обработать все элементы PATH в цикле FOR... если именно это и надо, в чём у меня нет уверенности...

sharky lions 14-04-2011 23:36 1658589

Цитата:

Цитата amel27
т.е. для заявленной задачи перебора ВСЕХ подходящих под условие папок эта фича не подходит - проще перебрать и обработать все элементы PATH в цикле FOR... если именно это и надо, в чём у меня нет уверенности... »

если это находится внутри цикла FOR то как раз перебор всех возможных вариантов возможен - почитай справку по этим операторам ))) перебор проводится не этим набором операторов, этот набор операторов предназначен для вывода пути к первому найденному файлу и буквы диска... т.е. для папки расположенной по адресу "C:\temp\test" выводит путь "\temp\test\" и букву диска "C:", что в итоге даёт искомое, "C:\temp\test"

упрощённый алгоритм следующий:
Код:

начало цикла
поиск объекта (в данном случае названия папок/файлов)
применение к найденной папке операторов %~dp$PATH:I
вывод значения в строку № i текстового файла (где i - универсальная переменная применяемая в счётчике циклов в VBA,
                                                      как правило, имеющая значения 1,2,3,4....n-2,n-1,n)

конец цикла

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


Время: 05:50.

Время: 05:50.
© OSzone.net 2001-