2016-09-26 178 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的文件。我想你一定一直在嘗試做別的事情。