我有一个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)
os.system("C:\\Temp\\ftp_test.bat a_ftp_user a_ftp_pass filename")
批处理文件ftp_test.bat如下。
Echo "****----****----****"
Echo "Uploading test.txt"
Echo "****----****----****"
Echo %1%
Echo %2%
Echo %3%
user="%1%"
pass="%2%"
file="%file%"
"WinSCP.com" ^
/log="C:\temp\WinSCP.log" /ini=nul ^
/command ^
"open sftp://%user%:%pass%@xx.xx.xxx/ -hostkey=""ssh-
xxxxxxxxxxxxxxxxxxxxxxxxxx""" ^
"put -nopermissions -nopreservetime %file%" ^
"exit"
执行此操作时,失败并显示错误: C:>搜索主机... 主机不存在 没有会话。 主机不存在 没有会议。
看起来发送的用户名和密码是处理而不是值。 独立地,当使用硬编码凭证执行批处理文件时,它可以正常工作。
我做错了什么?
答案 0 :(得分:0)
您正在传递a_ftp_user
,a_ftp_pass
的文字字符串
和filename
。
以下示例即使不需要也会引用参数 因为我不知道参数中是否存在空格。
您可以将变量与命令的字符串部分连接起来。
os.system('"C:\\Temp\\ftp_test.bat" "' + a_ftp_user + '" "' + a_ftp_pass + '" "' + filename + '"')
或者,您可以格式化字符串以避免+
连接和
改为使用{}
占位符。
os.system('"C:\\Temp\\ftp_test.bat" "{}" "{}" "{}"'.format(a_ftp_user, a_ftp_pass, filename))
或者,如果您使用的是Python 3.6+,则可以使用f-strings进行替换
带有值的字符串中的变量名。请注意字符串前的f
。
os.system(f'"C:\\Temp\\ftp_test.bat" "a_ftp_user" "a_ftp_pass" "filename"')
查看有关字符串格式的string - Common string operations。
最后,您的批处理语法要求更改set
,即:
set "user=%~1"
获得第一个参数。