Python变量值未传入批处理文件问题排查
问题根源与修复方案
你遇到的核心问题是Python调用批处理时,没有把变量的实际值传递过去,而是直接传了变量名文本。批处理收到的a_ftp_user、a_ftp_pass就是字符串本身,自然无法识别为有效凭据。下面是具体的修复步骤:
1. 修复Python脚本的传参逻辑
原来的os.system调用里,你直接把变量名写进了字符串,Python不会自动替换这些变量为实际值。需要用字符串插值(推荐f-string,Python3.6+支持)把变量值嵌入到命令字符串中:
修改后的Python代码片段:
for i, row in ftp_df.iterrows(): if row['client_name'] == client_name: a_ftp_host = row['ftp_host'] a_ftp_user = row['ftp_username'] a_ftp_pass = row['ftp_password'] print(a_ftp_host) print(a_ftp_user) print(a_ftp_pass) # 用f-string将变量值替换到命令中 os.system(f"C:\\Temp\\ftp_test.bat {a_ftp_user} {a_ftp_pass} filename")
如果你的凭据包含空格、&、$等特殊字符,记得给每个参数套上双引号,避免批处理解析出错:
os.system(f"C:\\Temp\\ftp_test.bat \"{a_ftp_user}\" \"{a_ftp_pass}\" \"filename\"")
2. 修复批处理文件的变量引用错误
你的批处理里写了file="%file%",但%file%是未定义的变量,应该用传入的第三个参数%3%来获取文件名:
修改后的批处理代码片段:
Echo "****----****----****" Echo "Uploading test.txt" Echo "****----****----****" Echo %1% Echo %2% Echo %3% user="%1%" pass="%2%" file="%3%" REM 这里把%file%改为%3%,对应传入的第三个参数 "WinSCP.com" ^ /log="C:\temp\WinSCP.log" /ini=nul ^ /command ^ "open sftp://%user%:%pass%@xx.xx.xxx/ -hostkey=""ssh-xxxxxxxxxxxxxxxxxxxxxxxxx""" ^ "put -nopermissions -nopreservetime %file%" ^ "exit"
验证逻辑
修改后运行脚本,批处理里的Echo %1%和Echo %2%会打印出你从DataFrame中提取的真实用户名和密码,WinSCP也能正确连接SFTP服务器执行上传操作了。
内容的提问来源于stack exchange,提问作者Lucky
相关产品推荐
相关产品推荐

