繁体   English   中英

批处理脚本可多次执行Python脚本

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM