python - 在 Python 中使用参数运行 WinSCP 脚本
问题描述
我正在尝试运行具有参数的 WinSCP 脚本%1%
。我在 cmd 中按如下方式运行脚本,它运行良好:
"C:\Program Files (x86)\WinSCP\WinSCP.com" /script=<filepath> /log=<logpath> /parameter <param1>
但是,如果我在 Python 中将它作为子进程运行,我无法弄清楚如何传递 param1 值。我究竟做错了什么?我试过:
cmdFile = <filepath>
logfile = <logpath>
param = <param1>
subprocess.run(["C:\Program Files (x86)\WinSCP\WinSCP.com", "/script=" + cmdFile, "/log=" + logfile, param] , shell=True)
subprocess.run(["C:\Program Files (x86)\WinSCP\WinSCP.com", "/script=" + cmdFile, "/log=" + logfile, "/parameter " + param] , shell=True)
subprocess.run(["C:\Program Files (x86)\WinSCP\WinSCP.com", "/script=" + cmdFile, "/log=" + logfile, "/parameter //" + param] , shell=True)```
解决方案
这是一个独立的示例,可以解决您的问题,并且可以通过运行一些小型本地 ftp 主机(如 ftpdmin(https://www.sentex.ca/~mwandel/ftpdmin/,无从属关系)轻松测试):
import subprocess
# create a test file
test_fn = 'test.txt'
with open(test_fn, 'w') as f:
f.write(
'Hello\n'
'World\n'
)
# create a script for WinSCP
script_fn = 'commands.txt'
with open(script_fn, 'w') as f:
f.write(
'open ftp://anonymous:@localhost\n'
'put "%1%"\n'
'put "%2%"\n'
'exit'
)
log_fn = 'log.txt'
# parameters to pass to the script (uploading the test file and the script)
parameters = [test_fn, script_fn]
# the adjusted command, passing '/parameter' and then just the parameters
subprocess.run([
'C:\Program Files (x86)\WinSCP\WinSCP.com',
'/script=' + script_fn,
'/log=' + log_fn,
'/parameter'
] + parameters, shell=True)
请注意,我将变量名称更改为更加 Pythonic,它们并没有错,但总是有改进的空间:)。
/parameter
您自己的解决方案的问题是您需要在命令行上的单个参数之后将参数传递给脚本。例如:
winscp.com /script=commands.txt /parameter one two three
这将启动脚本commands.txt
并传递one
,two
并传递three
给脚本,在那里它们可以被访问%1%
等。(请注意,如果它们可以包含空格,WinSCP 建议您在脚本中用引号将它们括起来)
在您的尝试中,您将 1.) 仅传递参数 2.)'/parameter param'
作为单个字符串,而不是像.run()
和 3.)所期望的那样传递两个,'/parameter //param'
这具有相同的问题,但添加了多余的双斜杠。
以您编写的形式,这将是正确的:
subprocess.run(["C:\Program Files (x86)\WinSCP\WinSCP.com", "/script=" + cmdFile, "/log=" + logfile, "/parameter", param], shell=True)
推荐阅读
- java - 无法使用 Selenium 和 Java 11 导入 org.openqa.selenium.WebDriver
- typescript - How to associate a function's input arguments with its return type to leverage autosuggest features
- sql-server - 我可以从将 Column2 与(Column2 与 Column1 中的最新时间戳)进行比较的表中选择 * 吗?
- html - 如何可访问地隐藏表格标题元素?
- android - Xamarin.Forms 和 Android - 从不同的视图获取切换按钮的结果
- rust - 为什么 reqwest 不返回此请求中的内容长度?
- android - 为什么我的 android 应用程序只需单击一下即可拍照?
- javascript - Angular:在 AJAX 成功时设置变量
- destroy - 主页对所有页面都应用了后伸,但想在某个页面上将其删除
- excel - 从一个单元格中拆分堆叠的数据并定界