簡體   English   中英

批處理腳本可多次執行Python腳本

[英]Batch script to execute a Python script multiple times

我需要運行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,則腳本僅運行服務器的一個實例,並告訴我:“無法訪問文件。該文件用於另一個過程”。 怎么了?

@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%在執行時解析為[空]。 這是因為直到整個FOR循環都是一個語句,在AFTER cmd解析%newport%之后才設置newport。 換句話說,%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的文件很奇怪。 我認為您一定在嘗試做其他事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM