如何通过Python脚本向.bat批处理文件传递多个输入参数
问题根因
你当前的实现混淆了命令行位置参数和**标准输入流(stdin)**两种传参逻辑:
- 你写的bat脚本中
%1、%~2、%~3是用于读取bat文件启动时,跟在程序名后的命令行位置参数 - 你Python代码中往
stdin写入的内容是程序启动后输入流的数据,bat并不会自动将这部分内容赋值给%1/%2/%3变量,因此日志中三个字段均为空
方案一:直接传递命令行参数(无需修改bat脚本,推荐)
直接将需要传递的参数按顺序放入subprocess.Popen的启动参数列表即可,修改后的Python代码如下:
import subprocess ipAdr = '127.0.0.1' pasWD = 'root' # 注意Windows路径前加r标识原始字符串,避免反斜杠被识别为转义字符 locPath = r'C:\repos\batTester' # 按 [bat路径, 参数1, 参数2, 参数3] 的格式传参 p = subprocess.Popen(['test.bat', ipAdr, pasWD, locPath]) # 等待bat脚本执行完成 p.wait()
方案二:保留stdin写入逻辑,修改bat脚本适配
如果你希望保持Python往stdin写数据的逻辑,需要修改bat脚本从stdin读取参数,用set /p命令实现:
修改后的bat代码:
@echo off :: 从标准输入流逐行读取参数 set /p IP= set /p PASS= set /p DIR= :: Setup logfile set LOG_FILE="%cd%\testLog.log" if exist %LOG_FILE% del %LOG_FILE% echo -------------------------------------------------------- >> %LOG_FILE% echo Date : %date% >> %LOG_FILE% echo Time : %time% >> %LOG_FILE% echo IP : %IP% >> %LOG_FILE% echo PW : %PASS% >> %LOG_FILE% echo PATH : %DIR% >> %LOG_FILE%
对应的Python代码需要补充换行符作为每次输入的结束标识:
import subprocess # 加text=True参数可以直接传字符串,不用手动转bytes p = subprocess.Popen('test.bat', stdin = subprocess.PIPE, text=True) ipAdr = '127.0.0.1' pasWD = 'root' locPath = r'C:\repos\batTester' # 每个参数末尾加换行符,匹配bat中set /p的读取结束规则 p.stdin.write(ipAdr + '\n') #IP p.stdin.write(pasWD + '\n') #password p.stdin.write(locPath + '\n')#directory # 强制刷新缓冲区确保数据写入 p.stdin.flush() p.wait()
内容的提问来源于stack exchange,提问作者MrmDdda
相关产品推荐
相关产品推荐

