Differences
This shows you the differences between the selected revisions of the page.
script_download_most_recent_file 2016-02-04 | script_download_most_recent_file 2022-06-16 (current) | ||
Line 2: | Line 2: | ||
===== [[library]] Using WinSCP .NET Assembly ===== | ===== [[library]] Using WinSCP .NET Assembly ===== | ||
- | ==== PowerShell ==== | + | |
+ | ==== [[powershell]] PowerShell ==== | ||
The following example uses [[library|WinSCP .NET assembly]] from a [[library_powershell|PowerShell]] script. If you have another preferred language, you can easily translate it. | The following example uses [[library|WinSCP .NET assembly]] from a [[library_powershell|PowerShell]] script. If you have another preferred language, you can easily translate it. | ||
<code powershell> | <code powershell> | ||
param ( | param ( | ||
- | $localPath = "c:\downloaded\", | + | $localPath = "c:\downloaded", |
- | $remotePath = "/home/user/" | + | $remotePath = "/home/user" |
) | ) | ||
Line 22: | Line 23: | ||
UserName = "user" | UserName = "user" | ||
Password = "mypassword" | Password = "mypassword" | ||
- | SshHostKeyFingerprint = "ssh-rsa 2048 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx" | + | SshHostKeyFingerprint = "ssh-rsa 2048 xxxxxxxxxxx..." |
} | } | ||
Line 50: | Line 51: | ||
# Download the selected file | # Download the selected file | ||
- | $session.GetFiles($session.EscapeFileMask($remotePath + $latest.Name), $localPath).Check() | + | $session.GetFileToDirectory($latest.FullName, $localPath) | Out-Null |
} | } | ||
finally | finally | ||
Line 60: | Line 61: | ||
exit 0 | exit 0 | ||
} | } | ||
- | catch [Exception] | + | catch |
{ | { | ||
- | Write-Host $_.Exception.Message | + | Write-Host "Error: $($_.Exception.Message)" |
exit 1 | exit 1 | ||
} | } | ||
</code> | </code> | ||
- | ==== C# ==== | + | ==== [[csharp]] C# ==== |
<code csharp> | <code csharp> | ||
Line 87: | Line 88: | ||
UserName = "user", | UserName = "user", | ||
Password = "mypassword", | Password = "mypassword", | ||
- | SshHostKeyFingerprint = "ssh-rsa 2048 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx", | + | SshHostKeyFingerprint = "ssh-rsa 2048 xxxxxxxxxxx...", |
}; | }; | ||
Line 95: | Line 96: | ||
session.Open(sessionOptions); | session.Open(sessionOptions); | ||
- | const string remotePath = "/home/user/"; | + | const string remotePath = "/home/user"; |
- | const string localPath = "c:\\downloaded\\"; | + | const string localPath = @"C:\downloaded"; |
// Get list of files in the directory | // Get list of files in the directory | ||
Line 115: | Line 116: | ||
// Download the selected file | // Download the selected file | ||
- | session.GetFiles(session.EscapeFileMask(remotePath + latest.Name), localPath).Check(); | + | session.GetFileToDirectory(latest.FullName, localPath); |
} | } | ||
Line 127: | Line 128: | ||
} | } | ||
} | } | ||
+ | </code> | ||
+ | |||
+ | ==== [[vbnet]] VB.NET ==== | ||
+ | |||
+ | The following snippet selects the most recent file from a directory listing. Most of the remaining code should be trivial to translate from the above C# example. | ||
+ | |||
+ | <code vbnet> | ||
+ | Dim latest As RemoteFileInfo = | ||
+ | directoryInfo.Files _ | ||
+ | .Where(Function(file) Not file.IsDirectory) _ | ||
+ | .OrderByDescending(Function(file) file.LastWriteTime) _ | ||
+ | .FirstOrDefault() | ||
</code> | </code> | ||
===== [[scripting]] Using WinSCP Scripting ===== | ===== [[scripting]] Using WinSCP Scripting ===== | ||
- | ==== In the Beta Version ==== | ||
- | &beta | ||
- | |||
Use the ''[[scriptcommand_get#latest|-latest]]'' switch of the ''[[scriptcommand_get|get]]'' command: | Use the ''[[scriptcommand_get#latest|-latest]]'' switch of the ''[[scriptcommand_get|get]]'' command: | ||
Line 139: | Line 149: | ||
</code> | </code> | ||
- | ==== In the Stable Version ==== | + | ===== [[alternatives]] Alternatives ===== |
- | + | ||
- | You may use following [[guide_automation_advanced#wsh|Windows script host JScript code]] (''example.js''): | + | |
- | + | ||
- | <code javascript> | + | |
- | // Configuration | + | |
- | + | ||
- | // Local path to download to (keep trailing slash) | + | |
- | var LOCALPATH = "c:\\downloaded\\"; | + | |
- | // Remote path to search in (keep trailing slash) | + | |
- | var REMOTEPATH = "/home/user/"; | + | |
- | // Mask of files to search for | + | |
- | var FILEMASK = "*.*"; | + | |
- | // Session to connect to | + | |
- | var SESSION = "session"; | + | |
- | // Path to winscp.com | + | |
- | var WINSCP = "c:\\program files\\winscp\\winscp.com"; | + | |
- | + | ||
- | var filesys = WScript.CreateObject("Scripting.FileSystemObject"); | + | |
- | var shell = WScript.CreateObject("WScript.Shell"); | + | |
- | + | ||
- | var logfilepath = filesys.GetSpecialFolder(2) + "\\" + filesys.GetTempName() + ".xml"; | + | |
- | + | ||
- | var exec; | + | |
- | + | ||
- | // run winscp to get list of file in the remote directory into XML log | + | |
- | exec = shell.Exec("\"" + WINSCP + "\" /xmllog=\"" + logfilepath + "\""); | + | |
- | exec.StdIn.Write( | + | |
- | "option batch abort\n" + | + | |
- | "open \"" + SESSION + "\"\n" + | + | |
- | "ls \"" + REMOTEPATH + FILEMASK + "\"\n" + | + | |
- | "exit\n"); | + | |
- | + | ||
- | // wait until it finishes and collect its output | + | |
- | var output = exec.StdOut.ReadAll(); | + | |
- | // optionally print the output | + | |
- | WScript.Echo(output); | + | |
- | + | ||
- | if (exec.ExitCode != 0) | + | |
- | { | + | |
- | WScript.Echo("Error retrieving list of files"); | + | |
- | WScript.Quit(1); | + | |
- | } | + | |
- | + | ||
- | // look for log file | + | |
- | var logfile = filesys.GetFile(logfilepath); | + | |
- | + | ||
- | if (logfile == null) | + | |
- | { | + | |
- | WScript.Echo("Cannot find log file"); | + | |
- | WScript.Quit(1); | + | |
- | } | + | |
- | + | ||
- | // parse XML log file | + | |
- | var doc = new ActiveXObject("MSXML2.DOMDocument"); | + | |
- | doc.async = false; | + | |
- | doc.load(logfilepath); | + | |
- | + | ||
- | doc.setProperty("SelectionNamespaces", | + | |
- | "xmlns:w='http://winscp.net/schema/session/1.0'"); | + | |
- | + | ||
- | var nodes = doc.selectNodes("//w:file"); | + | |
- | + | ||
- | // find the latest file | + | |
- | var filenameLatest = null; | + | |
- | var modificationLatest = null; | + | |
- | for (var i = 0; i < nodes.length; ++i) | + | |
- | { | + | |
- | var filename = nodes[i].selectSingleNode("w:filename/@value"); | + | |
- | var modification = nodes[i].selectSingleNode("w:modification/@value"); | + | |
- | if ((filename != null) && | + | |
- | (filename.value != ".") && | + | |
- | (filename.value != "..") && | + | |
- | (modification != null)) | + | |
- | { | + | |
- | // can compare timestamps stringwise | + | |
- | if ((modificationLatest == null) || | + | |
- | (modificationLatest < modification.value)) | + | |
- | { | + | |
- | modificationLatest = modification.value; | + | |
- | filenameLatest = filename.value; | + | |
- | } | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | // no file in the log | + | |
- | if (filenameLatest == null) | + | |
- | { | + | |
- | WScript.Echo("No file found"); | + | |
- | WScript.Quit(0); | + | |
- | } | + | |
- | + | ||
- | // run winscp to download the latest file | + | |
- | exec = shell.Exec("\"" + WINSCP + "\""); | + | |
- | exec.StdIn.Write( | + | |
- | "option batch abort\n" + | + | |
- | "option confirm off\n" + | + | |
- | "open \"" + SESSION + "\"\n" + | + | |
- | "get \"" + REMOTEPATH + filenameLatest + "\" \"" + LOCALPATH + "\"\n" + | + | |
- | "exit\n"); | + | |
- | + | ||
- | // wait until it finishes and collect its output | + | |
- | var output = exec.StdOut.ReadAll(); | + | |
- | // optionally print the output | + | |
- | WScript.Echo(output); | + | |
- | + | ||
- | if (exec.ExitCode != 0) | + | |
- | { | + | |
- | WScript.Echo("Error downloading " + filenameLatest); | + | |
- | WScript.Quit(1); | + | |
- | } | + | |
- | </code> | + | |
- | + | ||
- | Run the script with command: | + | |
- | <code batch> | + | |
- | cscript /nologo example.js | + | |
- | </code> | + | |
- | + | ||
- | ===== Alternatives ===== | + | |
Some of following alternatives can be easier to implement or actually even more appropriate for your specific task: | Some of following alternatives can be easier to implement or actually even more appropriate for your specific task: | ||
- | * Synchronizing a remote directory to a local directory (using ''[[scriptcommand_synchronize|synchronize local]]'' in scripting or ''[[library_session_synchronizedirectories|Session.SynchronizeDirectories(SynchronizationMode.Local, ...)]]'' in .NET assembly); | + | * Synchronizing a remote directory to a local directory (using ''[[scriptcommand_synchronize|synchronize local]]'' in scripting; or ''[[library_session_synchronizedirectories|Session.SynchronizeDirectories]]'' with ''mode'' parameter set to ''SynchronizationMode.Local'' in .NET assembly); |
* Downloading all files created in the last 24 hours (using [[file_mask|file mask]] ''*>=1D''; e.g. ''%%get -filemask="*>=1D" /home/user/*%%'', or an equivalent in .NET assembly). | * Downloading all files created in the last 24 hours (using [[file_mask|file mask]] ''*>=1D''; e.g. ''%%get -filemask="*>=1D" /home/user/*%%'', or an equivalent in .NET assembly). | ||
- | * Downloading all files created today (using ''[[scripting#timestamp|%TIMESTAMP%]]'' syntax to format [[file_mask|file mask]] with today's time constraint, e.g. ''%%get -filemask="*>=%TIMESTAMP#yyyy-mm-dd%" /home/user/*%%'', or an equivalent in .NET assembly). | + | * Downloading all files created today (using the [[file_mask#today|''today'' keyword in the file mask]]; e.g. ''%%get -filemask="*>=today" /home/user/*%%'', or an equivalent in .NET assembly). |
+ | * If you need to download all files that were not downloaded yet, but you do not keep local copies of the files to synchronize the remote directory against, see [[library_example_remember_downloaded_files|*]]. | ||
===== Further Reading ===== | ===== Further Reading ===== | ||
Line 269: | Line 162: | ||
* Guide to [[guide_automation|scripting/automation]]; | * Guide to [[guide_automation|scripting/automation]]; | ||
* [[library|WinSCP .NET assembly]]; | * [[library|WinSCP .NET assembly]]; | ||
- | * [[library_powershell|Using WinSCP .NET Assembly from PowerShell]]. | + | * [[library_powershell|*]]. |