用于多次执行Python脚本的批处理脚本

时间:2016-09-26 02:31:15

标签: python windows batch-file

我需要运行一次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,则脚本只运行一个服务器实例并告诉我:无法访问文件。该文件用于另一个进程“。怎么了?

2 个答案:

答案 0 :(得分:4)

@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 offecho off关闭命令报告。在{em>该命令

之前,命令将命令报告关闭之前@

主要问题:请参阅关于延迟扩展的许多文章。实质上,%var%指的是var的值,因为它是在循环的 start 处设置的,如果您想要在循环内更改时访问该值,您需要调用delayedexpansion并使用!var!

您需要解决的问题:cmd /k不是必需的,正如已经指出的那样,>很奇怪。

此外,您的逻辑将开始编号为5683,因为您在调用start之前添加了1 。可能是也可能不是问题。

答案 1 :(得分:1)

正如已经指出的那样,在你的FOR循环中,%newport%在执行时解析为[empty]。这是因为在AFTER cmd解析%newport%之前不会设置newport,因为整个FOR循环是一个语句。换句话说,%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的文件很奇怪。我想你一定是在尝试做别的事。