You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 14:57:04