Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Создание нескольких однотипных файлов

Ответить
Настройки темы
CMD/BAT - [решено] Создание нескольких однотипных файлов

Новый участник


Сообщения: 22
Благодарности: 0


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: Liquid Ocelot
Дата: 19-04-2013
Здравствуйте. Возникли затруднения с написанием необходимого bat файла.
Имеются два текстовых файла: ADBook.txt и Template.txt. В ADBook хранятся имена пользователей и названия id файлов. В Template.txt хранится шаблон, на основе которого создается необходимый файл setup.txt. Скрипт должен создавать отдельный файл setup.txt для каждого пользователя.

Файл ADBook
Код: Выделить весь код
Ivan A Ivanov/DOM/ORG/RU
iivanov.id
Sergey V Petrov/DOM/ORG/RU
spetrov.id
Файл Template.txt
Код: Выделить весь код
Username=%usrnm%
KeyfileName=C:\IBM\Lotus\Notes\Data\%idfl%
Domino.Name=server
Domino.Server=1
AdditionalServices=-1
IM.Server=fakeservername
IM.Port=80
IM.Protocol=1
У меня есть несколько вопросов:
1. Так как в имени пользователя содержатся пробелы, то что идет после первого из них откидывается. Как этого избежать?
2. Файлов должно быть большое количество, больше сотни. Можно ли сделать так, чтобы при создании файла создавалась и папка с именем пользователя, куда скрипт положит получившийся файл?

Заранее благодарен за помощь

Отправлено: 11:25, 19-04-2013

 

Ветеран


Сообщения: 1758
Благодарности: 966

Профиль | Цитировать


Правильно поставленный вопрос -- половина решения. Мне не все ясно, в частности с id, вот додумал сам:
Код: Выделить весь код
@echo off
setlocal

for /f "tokens=1 delims=/" %%i in (adbook.txt) do call:1 "%%i"
goto:eof


:1

if not defined name (

    set "name=%~1"
    md "D:\test\%~1"

) else (

    1>"D:\test\%name%\setup.txt" (

    echo Username=%name%
    echo KeyfileName=C:\IBM\Lotus\Notes\Data\%~1
    echo Domino.Name=server
    echo Domino.Server=1
    echo AdditionalServices=-1
    echo IM.Server=fakeservername
    echo IM.Port=80
    echo IM.Protocol=1

    )

    set "name="

)
Где D:\test -- папка для результирующих файлов. И Template.txt в теле батника.
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:03, 19-04-2013 | #2



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 874
Благодарности: 575

Профиль | Отправить PM | Цитировать


Liquid Ocelot,
примерно так:

Код: Выделить весь код
SET VAR1="%%J\setup.txt"
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F "skip=2 tokens=1,2* delims=[]/" %%I IN ('FIND /N " " ADBook.txt') DO (
IF NOT EXIST "%%J" MD "%%J"
ECHO Username=%%J/%%K>%VAR1%
SET /A VAR2=%%I+1
FOR /F "skip=2 tokens=1* delims=[]" %%L IN ('FIND /N "." ADBook.txt') DO (
IF %%L==!VAR2! ECHO KeyfileName=C:\IBM\Lotus\Notes\Data\%%M>>%VAR1%&&^
ECHO Domino.Name=server>>%VAR1%&&^
ECHO Domino.Server=^1>>%VAR1%&&^
ECHO AdditionalServices=-1>>%VAR1%&&^
ECHO IM.Server=fakeservername>>%VAR1%&&^
ECHO IM.Port=80>>%VAR1%&&^
ECHO IM.Protocol=^1>>%VAR1%
))
PAUSE
Данные из Template.txt в теле скрипта, т. е. для тестирования Template.txt не нужен.

Если что не так, попробуем доработать.
Это сообщение посчитали полезным следующие участники:

Отправлено: 22:15, 19-04-2013 | #3


Ветеран


Contributor


Сообщения: 2728
Благодарности: 1697

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
@Echo Off

Set template=template.txt
Set ADBook=ADBook.txt
Set Setup=Setup.txt

SetLocal EnableExtensions EnableDelayedExpansion

Set L=1
FOR /F "usebackq delims=/" %%s IN ("%ADBook%") DO (
	If !L!==1 (
		Set usrnmx=%%s&Set L=2
	) Else (
		Set idflx=%%s&Set L=1
		Call :Bat "!usrnmx!" "!idflx!"
	)
)
del "%template%.bat" 2>nul

GoTo :Eof

:Bat 
Set usrnm=%~1
Set idfl=%~2

MD "%~n2" 2>nul
del "%~n2\%Setup%" 2>nul
del "%template%.bat" 2>nul

FOR /F "usebackq delims=" %%i IN ("%template%") DO Echo Echo^>^>"%~n2\%Setup%" %%i>>"%template%.bat" 
Call "%template%.bat"

GoTo :Eof

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 00:36, 20-04-2013 | #4


Новый участник


Сообщения: 22
Благодарности: 0

Профиль | Отправить PM | Цитировать


Спасибо большое за помощь, господа. Все скрипты работают, но у Foreigner и megaloman почему-то откидывается часть имени — "/DOM/ORG/RU". Не уверен, насколько это будет критично для инсталлятора софта, проверить смогу только на работе, увы. Тем не менее, ещё раз спасибо!

Отправлено: 11:08, 20-04-2013 | #5


Ветеран


Contributor


Сообщения: 2728
Благодарности: 1697

Профиль | Отправить PM | Цитировать


Цитата Liquid Ocelot:
господа... почему-то откидывается часть имени — "/DOM/ORG/RU"
Господняя сила! Я столько усилий потратил, чтобы, как я считал, выделить имя из цепочки и отбросить /DOM/ORG/RU, не было четкой постановки, что такое имя. Уберите разделитель / в FOR , то есть: Вместо
Код: Выделить весь код
FOR /F "usebackq delims=/" %%s IN ("%ADBook%") DO (
напишите
Код: Выделить весь код
FOR /F "usebackq delims=" %%s IN ("%ADBook%") DO (
А с каким именем должна создаваться папка? Символы / в именах недопустимы. У меня папки делались по имени файла, но возможен вариант, что по имени в нечетной строке ADBook, только с заменой / на нечто другое, например # (то есть наманер
"Ivan A Ivanov#DOM#ORG#RU" , при этом надо заменить кусок кода
Код: Выделить весь код
Set Name=%usrnm:/=#%
MD "%Name%" 2>nul
del "%Name%\%Setup%" 2>nul
del "%template%.bat" 2>nul

FOR /F "usebackq delims=" %%i IN ("%template%") DO Echo Echo^>^>"%Name%\%Setup%" %%i>>"%template%.bat"
Вообще при решении я ставил целью, чтобы батник работал именно с файлами ADBook.txt и Template.txt, без включения их содержимого в код запускаемого пользователем батника. Подозреваю, можно сделать элегантнее.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 20-04-2013 в 13:51.

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:04, 20-04-2013 | #6


Ветеран


Сообщения: 874
Благодарности: 575

Профиль | Отправить PM | Цитировать


Цитата megaloman:
А с каким именем должна создаваться папка? Символы / в именах недопустимы. »
megaloman,
чтобы имя папки визуально отображалось по типу "Ivan A Ivanov/DOM/ORG/RU", можно скриптом создать в каждой папке файл desktop.ini с содержимым типа

Код: Выделить весь код
[.ShellClassInfo]
LocalizedResourceName=Ivan A Ivanov/DOM/ORG/RU
и атрибутировать (для Windows XP необязательно) зти папки как только для чтения:

Код: Выделить весь код
ATTRIB +R "imya papki"
Но, по-моему, это излишне.

Последний раз редактировалось Georgio, 20-04-2013 в 15:19. Причина: Незначительное изменение оформления


Отправлено: 14:45, 20-04-2013 | #7


Новый участник


Сообщения: 22
Благодарности: 0

Профиль | Отправить PM | Цитировать


megaloman, я имел в виду, что в конечном файле, т.е. в setup.txt в строке Username=Ivan A Ivanov нет /DOM/ORG/RU. Имена папок, которые создает ваш скрипт, меня устраивают :>
Прошу прощения, за неточные формулировки своих сообщений :<

Отправлено: 16:05, 20-04-2013 | #8


Новый участник


Сообщения: 22
Благодарности: 0

Профиль | Отправить PM | Цитировать


megaloman, да всё работает. Большое спасибо!

Отправлено: 17:22, 20-04-2013 | #9



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Создание нескольких однотипных файлов

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Создание одного файла из нескольких ajakzs Скриптовые языки администрирования Windows 4 04-03-2012 19:39
CMD/BAT - [решено] Создание папок по дате получения файлов и перемещение в них файлов KamikadZZe Скриптовые языки администрирования Windows 1 01-09-2011 14:15
CMD/BAT - [решено] Обработка нескольких файлов laipisas02 Скриптовые языки администрирования Windows 8 15-03-2010 15:43
Загрузка - Создание на флэшкe загрузчика для нескольких систем sitop Microsoft Windows Vista 8 06-04-2009 23:06
[решено] Создание нескольких доменов на одном физическом сервере? alexws Microsoft Windows NT/2000/2003 4 21-11-2005 17:50




 
Переход