【问题标题】:Run WinSCP script in Python with parameters在 Python 中使用参数运行 WinSCP 脚本
【发布时间】:2021-12-03 06:03:02
【问题描述】:

我正在尝试运行具有参数%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)```

【问题讨论】:

    标签: python parameters ftp subprocess winscp


    【解决方案1】:

    这是一个独立的示例,可以解决您的问题,并且可以通过运行一些小型本地 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 中启动脚本并将onetwothree 传递给脚本,在那里它们可以作为%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)
    

    【讨论】:

    • 成功了!这是一个简单的修复。非常感谢。是的,同意你对变量名的看法——这只是一个例子,但会在我的代码中适当地命名我的变量。
    猜你喜欢
    • 1970-01-01
    • 2015-06-12
    • 2021-12-16
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 2012-08-14
    • 2021-11-24
    • 1970-01-01
    相关资源
    最近更新 更多