运行 Python 中带参数的 WinSCP 脚本
Run WinSCP script in Python with parameters
我正在尝试 运行 具有参数 %1%
的 WinSCP 脚本。我 运行 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.) [=21= 预期的两个] 有同样的问题,但添加了多余的双斜杠。
按照你写的形式,这应该是正确的:
subprocess.run(["C:\Program Files (x86)\WinSCP\WinSCP.com", "/script=" + cmdFile, "/log=" + logfile, "/parameter", param], shell=True)
我正在尝试 运行 具有参数 %1%
的 WinSCP 脚本。我 运行 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.) [=21= 预期的两个] 有同样的问题,但添加了多余的双斜杠。
按照你写的形式,这应该是正确的:
subprocess.run(["C:\Program Files (x86)\WinSCP\WinSCP.com", "/script=" + cmdFile, "/log=" + logfile, "/parameter", param], shell=True)