Расчет внутри цикла FOR - PullRequest
       42

Расчет внутри цикла FOR

0 голосов
/ 17 декабря 2018

Я пытаюсь настроить запланированные задачи для всех машин в нашей сети.Таким образом, они не все имеют одинаковое время начала, я редактирую файл XML, чтобы использовать случайное время.Изменение XML работает нормально, но как только я помещаю цикл For для его использования server.txt, я получаю сообщение об ошибке: «+10 было неожиданным в это время».

@echo off

for /F "tokens=*" %%i in (servers.txt) do (

set file=original.xml
set insertline=9
SET /a uur=(%RANDOM%*6/32768)+10
SET /a minuut=(%RANDOM%*50/32768)+10
set output=output.XLM

(for /f "tokens=1* delims=[]" %%a in ('find /n /v "##" ^< "%file%"') do (
    if "%%~a"=="%insertline%" (
    echo ^<StartBoundary^>2018-12-17T%uur%:%minuut%:43.9766025^<^/StartBoundary^>
    REM ECHO.%%b
    ) ELSE (
    echo.%%b
    )
    )) > %output%

SchTasks /Create /S \\%%i /RU username /RP password /XML output.XLM /TN task_name

)

Ответы [ 3 ]

0 голосов
/ 17 декабря 2018

Я думаю, что перезапись output.xml предназначена для создания новой задачи из шаблона с другим (случайным) StartBoundary.

Но все константы (переопределенные внутри блока кода) должны быть перемещены наружу впередний.

Поскольку внутренняя структура for имеет только команду if / else, один набор скобок является излишним.

Правильный отступ помогает сохранить обзор кода.

:: Q:\Test\2018\12\17\SO_53814701.cmd
@echo off & Setlocal EnableDelayedExpansion

set file=original.xml
set insertline=9
set output=output.XLM

for /F "tokens=*" %%i in (servers.txt) do (
    SET /a "uur=(!RANDOM!*6/32768)+10"
    SET /a "minuut=(!RANDOM!*50/32768)+10"
    (   for /f "tokens=1* delims=[]" %%a in (
            'find /n /v "##" ^< "%file%"'
        ) do if "%%~a"=="%insertline%" (
            echo ^<StartBoundary^>2018-12-17T%uur%:%minuut%:43.9766025^<^/StartBoundary^>
            REM ECHO.%%b
        ) ELSE (
            echo.%%b
        )
    ) > %output%
    SchTasks /Create /S \\%%i /RU username /RP password /XML output.XLM /TN task_name
)
0 голосов
/ 17 декабря 2018

Ну ... я что-то изменил, и теперь это работает ...

@echo off
setlocal EnableDelayedExpansion

for /F "tokens=*" %%i in (servers.txt) do (

set file=original.xlm
set insertline=9
SET /a "uur=(!RANDOM!*6/32768^)+10"
SET /a "minuut=(!RANDOM!*50/32768^)+10"
set output=output.XLM
echo !uur!:!minuut!
(for /f "tokens=1* delims=[]" %%a in ('find /n /v "##" ^< "!file!"') do (
if "%%~a"=="!insertline!" (
echo ^<StartBoundary^>2018-12-17T!uur!:!minuut!:43.9766025^<^/StartBoundary^>
REM ECHO.%%b
) ELSE (
echo.%%b
)
)) > !output!

SchTasks /Create /S \\%%i /RU username /RP password /XML output.XLM /TN task_name

)
)
)

Я думаю, что это изменило все% для!в течение FOR

0 голосов
/ 17 декабря 2018

Закрывающие скобки в ваших set командах слишком рано закрывают цикл for.

Вот два возможных способа преодоления этого:

SET /a "uur=(%RANDOM%*6/32768)+10"
SET /a minuut=(%RANDOM%*50/32768^)+10

Первый обеспечивает), заключив все назначение в кавычки, второй экранирует ) (с кареткой ^).(вы должны последовательно использовать ОДНУ из этих возможностей во всем вашем скрипте - я бы порекомендовал первый (с кавычками))

Еще один сбой: %RANDOM% будет давать вам одно и то же значение каждый раз в командном блоке(используйте отложенное расширение , чтобы преодолеть это.

Позже в скрипте вы столкнетесь с той же проблемой с переменными file и insertline. Также измените значение с %file% и *От 1021 * до !file! и !insertline!.

...