2016-09-26 179 views
1

我需要运行Python脚本N次,所以我创建下面的脚本:批处理脚本来执行Python脚本多次

@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 

如果我输入作为输入值,使得有只有一次迭代,脚本可以工作,但如果我选择2,脚本只运行服务器的一个实例,并告诉我:“无法访问文件,该文件在另一个进程中使用”。怎么了?

+2

为什么将输出重定向到名为“start”的文件? – eryksun

回答

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 

的逻辑错误:在每次迭代中,您要添加1至PORT,但port永远不会改变。您需要将newport初始化为port的值并增量newport

小问题问题:@@echo off后不需要。 echo off将关闭命令报告。 @命令之前将命令回报功能,该命令只

主要问题:请参阅SO约延迟扩展很多很多的文章。从本质上说,%var%var的价值,因为它被定为开始循环的,如果你要访问的价值,因为它在循环中的变化,你需要调用delayedexpansion和使用!var!

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

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

1

正如已经指出的那样,在FOR循环中,%newport%在执行时解析为[空]。这是因为newport没有设置,直到AFTER cmd解析%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的文件。我想你一定一直在尝试做别的事情。