我需要运行一次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,则脚本只运行一个服务器实例并告诉我:无法访问文件。该文件用于另一个进程“。怎么了?
答案 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 off
。 echo 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的文件很奇怪。我想你一定是在尝试做别的事。