Search code examples
powershellbatch-fileputty

Powershell Putty Connection and Automating Tasks


I want to use PowerShell to connect to a PuTTY "saved session" and then specify a file that contains some batch commands. Using CMD this would look like

d:\putty\psftp 'Saved Session Name' -b d:\location.txt.

I think that the PS equivalent should look like

Start-Process d:\putty\psftp.exe 'Saved Session Name' 
(and then a call to pass a 'get' script) i.e. cd Outgoing get <date>.txt 

However, I get the following error:

a positional parameter cannot be found that accepts the argument

How can I accomplish this using PowerShell?


Solution

  • You don't necessarily need Start-Process.

    What happens when you try to run d:\putty\psftp.exe 'Saved Session Name' -b d:\location.txt from Powershell? The first thing I do is try it exactly like I'd run it from the command line.

    The biggest catch is if you have spaces in path names. You might need to use quotes and the call operator (ampersand): &"d:\putty\psftp.exe" 'Saved Session Name' -b "d:\location.txt".

    If you do need to use Start-Process, you can do this:

    Start-Process -FilePath "d:\putty\psftp.exe" `
        -ArgumentList "'Saved Session Name' -b d:\location.txt" -Wait
    

    Or like this:

    Start-Process -FilePath "d:\putty\psftp.exe" `
        -ArgumentList 'Saved Session Name', '-b', "d:\location.txt" -Wait
    

    Note that the argument list in the first is a single string with every argument in it, and in the second it is an array of strings with one string for every argument. Everything needs to be in the same order that they'd be on the command line, and it's not uncommon for it to be a bit flaky. Usually one method or the other works better, but it depends on the application you're calling. Usually with quotes and spaces in path names because you're going through multiple levels of escaping depending on the program you're calling (noticing a theme?).

    I added the -Wait parameter to my code above because, by default, Start-Process continues to the next line without waiting since it actually spawns a separate process. -Wait forces Powershell to, well, wait, which is what people usually want in a non-interactive script.

    See Get-Help about_Operators or Get-Help "call operator" for more topics for help with the call operator. See Get-Help Start-Process for help with that.