Показать полную графическую версию : [решено] Создание нескольких однотипных файлов
Liquid Ocelot
19-04-2013, 11:25
Здравствуйте. Возникли затруднения с написанием необходимого 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. Файлов должно быть большое количество, больше сотни. Можно ли сделать так, чтобы при создании файла создавалась и папка с именем пользователя, куда скрипт положит получившийся файл?
Заранее благодарен за помощь
Foreigner
19-04-2013, 19:03
Правильно поставленный вопрос -- половина решения. Мне не все ясно, в частности с 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 в теле батника.
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 не нужен.
Если что не так, попробуем доработать.
megaloman
20-04-2013, 00:36
@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
Liquid Ocelot
20-04-2013, 11:08
Спасибо большое за помощь, господа. Все скрипты работают, но у Foreigner и megaloman почему-то откидывается часть имени — "/DOM/ORG/RU". Не уверен, насколько это будет критично для инсталлятора софта, проверить смогу только на работе, увы. Тем не менее, ещё раз спасибо!
megaloman
20-04-2013, 13:04
господа... почему-то откидывается часть имени — "/DOM/ORG/RU"Господняя сила!:lol: Я столько усилий потратил, чтобы, как я считал, выделить имя из цепочки и отбросить /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,
чтобы имя папки визуально отображалось по типу "Ivan A Ivanov/DOM/ORG/RU", можно скриптом создать в каждой папке файл desktop.ini с содержимым типа
[.ShellClassInfo]
LocalizedResourceName=Ivan A Ivanov/DOM/ORG/RU
и атрибутировать (для Windows XP необязательно) зти папки как только для чтения:
ATTRIB +R "imya papki"
Но, по-моему, это излишне.
Liquid Ocelot
20-04-2013, 16:05
megaloman, я имел в виду, что в конечном файле, т.е. в setup.txt в строке Username=Ivan A Ivanov нет /DOM/ORG/RU. Имена папок, которые создает ваш скрипт, меня устраивают :>
Прошу прощения, за неточные формулировки своих сообщений :<
Liquid Ocelot
20-04-2013, 17:22
megaloman, да всё работает. Большое спасибо!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.