在FOR循环内计算

时间:2018-12-17 11:53:01

标签: batch-file for-loop variables schtasks.exe

我正在尝试为我们网络中的所有计算机设置计划任务。因此,它们的开始时间并不相同,我将XML文件编辑为使用随机时间。更改XML可以正常工作,但是一旦我在其周围放置一个For循环以使用servers.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 :(得分:1)

您的set命令中的右括号括住for循环为时过早。

以下是两种可能的解决方法:

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

第一个通过将整个分配括在引号中来保护),第二个逃脱了)(带有尖号^)。 (您应该在整个脚本中始终使用其中一种可能性-我建议第一个(带引号))

另一个失败:%RANDOM%每次在命令块中都会给您相同的值(使用delayed expansion可以解决这个问题。

稍后,在脚本中,fileinsertline变量也有相同的问题。因此,也从%file%%insertline%更改为!file!!insertline!

答案 1 :(得分:0)

我认为覆盖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
)

答案 2 :(得分:0)

嗯...我做了一些更改,现在可以使用...

@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