[英]Batch script to execute a Python script multiple times
我需要运行Python脚本N次,因此创建了以下脚本:
@ECHO OFF
cd PATH_TO_SCRIPT
@set port=5682
set /P INPUT=Number of servers:
FOR /L %%I IN (1, 1, %INPUT%) DO (
@set /a newport=%port%+1
start cmd /k > start python server.py -i 192.168.1.2 -p %newport%
)
pause
如果我输入1作为输入值,这样就只有一次迭代,脚本可以工作,但是如果我选择2,则脚本仅运行服务器的一个实例,并告诉我:“无法访问文件。该文件用于另一个过程”。 怎么了?
@ECHO OFF
setlocal enabledelayedexpansion
cd PATH_TO_SCRIPT
set port=5682
set /P INPUT=Number of servers:
set /a newport=%port%
FOR /L %%I IN (1, 1, %INPUT%) DO (
set /a newport+=1
start cmd /k > start python server.py -i 192.168.1.2 -p !newport!
)
pause
逻辑错误:在每次迭代中,您将PORT
加1,但是port
永远不会改变。 您需要将newport
初始化为port
的值,并增加newport
。
次要样式问题: @echo off
之后不需要@
。 echo off
关闭命令报告。 @
在命令关闭命令报告之前仅对该命令关闭
主要问题:请参阅SO上有关延迟扩展的许多文章。 本质上, %var%
指的是在循环开始时设置的var
的值,如果您想在循环内更改时访问它的值,则需要调用delayedexpansion
并使用!var!
要解决的问题: cmd /k
不是必需的,并且>
如前所述,是奇怪的。
另外,您的逻辑将从5683开始编号,因为在调用start
之前加了1。 可能是或可能不是问题。
如前所述,在您的FOR循环中,%newport%在执行时解析为[空]。 这是因为直到整个FOR循环都是一个语句,在AFTER cmd解析%newport%之后才设置newport。 换句话说,%newport%在执行循环中的命令之前已得到解析,这意味着尚未设置它,并且/ p什么也没有。 因此大概每次都使用相同的端口。
不过,您不必使用延迟扩展。 您可以只使用FOR / L迭代器(%% I)。 我认为这会更简单。
@ECHO OFF & SETLOCAL
CD PATH_TO_SCRIPT
SET /P INPUT=Number of servers:
SET /A END=5682+%INPUT%-1
FOR /L %%I IN (5682, 1, %END%) DO (
START python server.py -i 192.168.1.2 -p %%I
)
PAUSE
另外,我同意将输出重定向到名为start的文件很奇怪。 我认为您一定在尝试做其他事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.