Python变量未作为值发送到批处理文件

时间:2018-05-24 23:40:29

标签: python batch-file

我有一个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:>搜索主机...    主机不存在    没有会话。    主机不存在    没有会议。

看起来发送的用户名和密码是处理而不是值。  独立地,当使用硬编码凭证执行批处理文件时,它可以正常工作。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

您正在传递a_ftp_usera_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"

获得第一个参数。