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

我需要运行一个Python脚本N次,所以我创build了下面的脚本:

@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 

如果我input1作为input值,这样只有一次迭代,脚本就可以工作,但是如果我select2,脚本只运行一个服务器实例并告诉我:“无法访问文件。另一个过程“。 怎么了?

 @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%在执行时解析为[empty]。 这是因为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的文件是很奇怪的。 我想你一定是一直在尝试做别的事情。