Batch file 在FOR循环中计算

Batch file 在FOR循环中计算,batch-file,for-loop,variables,windows-task-scheduler,Batch File,For Loop,Variables,Windows Task Scheduler,我正在尝试为网络中的所有机器设置计划任务。因此,它们的开始时间并不相同。我编辑XML文件以使用随机时间。更改XML工作正常,但当我在其周围放置For循环以使用servers.txt时,我收到一条错误消息:“+10此时出乎意料。” @echo关闭 对于(servers.txt)中的/F“tokens=*”%%i( set file=original.xml 设置insertline=9 设置/a uur=(%RANDOM%*6/32768)+10 设置/a分钟=(%RANDOM%*50/32768

我正在尝试为网络中的所有机器设置计划任务。因此,它们的开始时间并不相同。我编辑XML文件以使用随机时间。更改XML工作正常,但当我在其周围放置For循环以使用servers.txt时,我收到一条错误消息:“+10此时出乎意料。”

@echo关闭
对于(servers.txt)中的/F“tokens=*”%%i(
set file=original.xml
设置insertline=9
设置/a uur=(%RANDOM%*6/32768)+10
设置/a分钟=(%RANDOM%*50/32768)+10
设置输出=输出.XLM
(对于/f“tokens=1*delims=[]”%%a in('find/n/v“##“^<%file%”)do(
如果“%%~a”=%insertline%”(
回声^2018-12-17T%uur%:%Minut%:43.9766025^
REM回波。%%b
)否则(
回声%%b
)
))>%输出%
SchTasks/Create/S\\%%i/RU用户名/RP密码/XML输出.XLM/TN任务名称
)

您的
set
命令中的右括号过早地关闭了
for
循环

以下是克服这一问题的两种可能方法:

SET /a "uur=(%RANDOM%*6/32768)+10"
SET /a minuut=(%RANDOM%*50/32768^)+10
第一个通过将整个赋值括在引号中来保护
,第二个通过插入符号
^
)来转义
。(您应该在整个脚本中始终使用其中一种可能性-我推荐第一种(带引号))

另一个失败:
%RANDOM%
在命令块中每次都会给您相同的值(用于克服此问题)


在脚本的后面部分,您对
文件
插入行
变量也有同样的问题。因此,将
%file%
%insertline%
更改为
!file!
!insertline!
我认为覆盖
输出.xml
是为了从具有不同租金(随机)起始边界

但是所有常量(在代码块内重新定义)都应该从外部移到前面

由于内部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
)
::Q:\Test\2018\12\17\SO\u 53814701.cmd
@echo off&设置本地启用延迟扩展
set file=original.xml
设置insertline=9
设置输出=输出.XLM
对于(servers.txt)中的/F“tokens=*”%%i(
设置/a“uur=(!RANDOM!*6/32768)+10”
设置/a“分钟=(!随机!*50/32768)+10”
(对于/f“tokens=1*delims=[]”中的%%a(
“查找/n/v”##“^<%file%”
)如果“%%~a”=%insertline%”,则执行此操作(
回声^2018-12-17T%uur%:%Minut%:43.9766025^
REM回波。%%b
)否则(
回声%%b
)
)>%输出%
SchTasks/Create/S\\%%i/RU用户名/RP密码/XML输出.XLM/TN任务名称
)

嗯……我改变了一些东西,现在它可以工作了

@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

)
)
)
@echo关闭
setlocal EnableDelayedExpansion
对于(servers.txt)中的/F“tokens=*”%%i(
设置文件=original.xlm
设置insertline=9
设置/a“uur=(!RANDOM!*6/32768^)+10”
设置/a“分钟=(!随机!*50/32768^)+10”
设置输出=输出.XLM
回声!uur!:!分钟!
(对于/f“tokens=1*delims=[]”%%a in('find/n/v“##”^<“!file!”)do(
如果“%%~a”==”!插入行!”(
回声^2018-12-17T!uur!:!分钟数!:43.9766025^
REM回波。%%b
)否则(
回声%%b
)
))>!输出!
SchTasks/Create/S\\%%i/RU用户名/RP密码/XML输出.XLM/TN任务名称
)
)
)

我想它改变了所有的百分比!顺便说一下,在FOR

Oh中,我使用+10的原因是10以下的随机数只给出一个位数。我怀疑这可能会给时间格式带来问题。所以它应该给出一个介于10和59之间的数字。uur=hour minut=minutetry尝试延迟扩展,同样的错误:(这里确实需要延迟扩展,但这并不是
+10此时意外的原因。
(以及)@echo off setlocal EnableDelayedExpansion 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 echo!uur!:!minuut!)可以,但当我也使用第二个循环时:命令的语法不正确。请将您的新代码编辑到您的问题中;注释没有格式功能,几乎无法读取您的代码。
@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

)
)
)