Advanced FTP/SFTP scripting
WinSCP .NET assembly mostly deprecates techniques demostrated in this article. Using the assembly is now preferred approach for advanced automation tasks with WinSCP.
Before reading this guide make sure you are familiar with WinSCP scripting. For that you may want to read guide to automation.
Scripting functionality of WinSCP does not support any control sequences, manipulation of file paths, etc. If you need these, you have to call WinSCP script from wrapper script implemented in another scripting language.
Advertisement
- Choosing Language
- Windows command interpreter (batch files)
- Windows script host (JScript or VB script)
- .NET (C# or VB.NET)
- External script interpreters (PowerShell, PHP, Perl, etc)
- Further reading
Choosing Language
Use language of your preference. If you have no preference or do not know any scripting language, the easiest may be to use scripting engines available in Windows:
- Windows command interpreter (
cmd.exe
) to run.bat
or.cmd
files (for simple tasks); - Windows script host (
cscript.exe
orwscript.exe
) to run Java Script or VB Script files.
Windows command interpreter (batch files)
Windows command interpreter executes .bat
or .cmd
files. Some of the features it supports:
- Conditional execution based on an exit code of an application or a value of an environment variable;
- An iteration over files matching a mask;
- Setting and querying environment variables;
- Simple file path manipulation (extracting a directory from a path, extracting an extension, etc.).
Advertisement
See guide to automation for some examples.
Windows script host (JScript or VB script)
Windows script host is an automation technology for Microsoft Windows that provides scripting capabilities comparable to batch files, but with a greater range of supported features. It is language-independent. By default it interprets and runs plain-text JScript (JavaScript-like) and VBScript. Users can install different scripting engines.
It supports all the features listed in Windows command interpreter section above (with greater flexibility). Plus it includes many advanced functions, you may find useful when using together with WinSCP. See sections below.
To use the examples below copy the JScript code to file (e.g. example.js
) and use cscript.exe
to execute it (use /nologo
to suppress banner):
cscript /nologo example.js
Access to Input/Output streams
You can use WScript.Shell
to execute WinSCP console interface tool and feed the script commands (using input stream), without creating temporary script file:
var shell = WScript.CreateObject("WScript.Shell"); // run (make it log to XML) var exec = shell.Exec("winscp.com /xmllog=log.xml"); // feed the commands exec.StdIn.Write( "option batch abort\n" + "open mysession\n" + "ls\n" + "exit\n"); // wait until it finishes and collect its output var output = exec.StdOut.ReadAll(); // optionally print the output WScript.Echo(output);
XML parsing
You can use MSXML2.DOMDocument
object to parse XML log produced by WinSCP. The following example follows up to the previous one (which starts session with XML logging and lists contents of initial directory):
// parse XML log file var doc = new ActiveXObject("MSXML2.DOMDocument"); doc.async = false; doc.load("log.xml"); doc.setProperty("SelectionNamespaces", "xmlns:w='http://winscp.net/schema/session/1.0'"); // look for file tags var nodes = doc.selectNodes("//w:file"); WScript.Echo("There are " + nodes.length + " files and subdirectories:"); // list the files for (var i = 0; i < nodes.length; ++i) { var filename = nodes[i].selectSingleNode("w:filename/@value").value; WScript.Echo(filename); }
Advertisement
Running the script will produce output like:
There are 14 files and subdirectories: . .. .htaccess commandline.txt config.txt directory_cache.txt dragext.txt faq.txt faq_commandline.txt faq_dir_default.txt faq_download_temp.txt faq_drag_move.txt faq_error_code.txt faq_filemanager.txt
See also the guide Interpreting XML log for advanced scripting (uses C# language, though could be easily rewritten to JScript or VB script).
.NET (C# or VB.NET)
External script interpreters (PowerShell, PHP, Perl, etc)
If you are familiar with other scripting languages, you can use those.
All versions of Windows since Windows XP have PowerShell available. With PowerShell, it is more convenient to use WinSCP .NET assembly, than the simple scripting. There are lot of examples of use of the WinSCP .NET assembly in PowerShell.
If you want to use your another favorite scripting language, but you do not have it on your Windows machine, you may find installing it troublesome. But you may not need to install anything actually. E.g. for using PHP interpreter, you can just grab the Windows binary PHP zip package and extract php.exe
and php7ts.dll
files out of it. These two binaries alone support most (if not all) features you need. No installing or registration is required.
Advertisement
Having the two binaries you can execute PHP script example.php
:
<? system("winscp.com /script=example.txt", $exitcode); if ($exitcode == 0) { echo "success\n"; } else { echo "error\n"; // handle an error } ?>
with simple command:
php.exe example.php
Further reading
- Troubleshooting;
- WinSCP .NET assembly;
- Scripting documentation;
- Guide to automation;
- FAQ about scripting;
- Example scripts.