Компьютерный форум 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=258955)

Liquid Ocelot 19-04-2013 11:25 2135673

Создание нескольких однотипных файлов
 
Здравствуйте. Возникли затруднения с написанием необходимого 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 2136034

Правильно поставленный вопрос -- половина решения. Мне не все ясно, в частности с 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 в теле батника.

Georgio 19-04-2013 22:15 2136125

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 2136175

Код:

@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 2136268

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

megaloman 20-04-2013 13:04 2136329

Цитата:

Цитата Liquid Ocelot
господа... почему-то откидывается часть имени — "/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, без включения их содержимого в код запускаемого пользователем батника. Подозреваю, можно сделать элегантнее.

Georgio 20-04-2013 14:45 2136365

Цитата:

Цитата megaloman
А с каким именем должна создаваться папка? Символы / в именах недопустимы. »

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 2136398

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

Liquid Ocelot 20-04-2013 17:22 2136455

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


Время: 13:08.

Время: 13:08.
© OSzone.net 2001-