3

I have to run a few commands of WinSCP from a Python class using subprocess.

The goal is to connect a local Windows machine and a Windows server with no FTP installed and download some files. This is what I tried

python    
proc = subprocess.Popen(['WinSCP.exe', '/console', '/WAIT',  user:password@ip:folder , '/WAIT','get' ,'*.txt'], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

With this I get it to open the WinSCP console and connect to the server, but it doesn't execute the get command. Is the problem because the get is executed on the Windows console and not in the WinSCP console?

I also tried replacing winscp.exe /console for winscp.com /command.

Is there any way to do this?

Martin Prikryl
  • 188,800
  • 56
  • 490
  • 992
Diego
  • 33
  • 1
  • 1
  • 3

2 Answers2

2

If you want do without generating a script file, you can use a code like this:

import subprocess

process = subprocess.Popen(
    ['WinSCP.com', '/ini=nul', '/command',
     'open ftp://user:password@example.com', 'get *.txt', 'exit'],
    stdout=subprocess.PIPE, stderr=subprocess.PIPE)
for line in iter(process.stdout.readline, b''):  # replace b'' with '' for Python 2
    print(line.decode().rstrip())

The code uses:


Though using the array for the arguments won't work, if there are spaces in command arguments (like file names). Then you will have to format the complete command-line yourself. See Python double quotes in subprocess.Popen aren't working when executing WinSCP scripting.

Martin Prikryl
  • 188,800
  • 56
  • 490
  • 992
1

So when using the /script option you should specify a file containing the batch commands.

To specify all the commands on the command line as you're doing, use the /command option instead of /script.

jspcal
  • 50,847
  • 7
  • 72
  • 76