Differences

This shows you the differences between the selected revisions of the page.

2009-04-14 2009-04-15
guide_automation_advanced (martin) the most recent file with wsh (martin)
Line 97: Line 97:
===== Downloading the most recent file ===== ===== Downloading the most recent file =====
-The script below requires opening separate [[shell session]] to invoke remote-side scripting.+You may use following Windows script host JavaScript code (''example.js''):
-<code winscp+<code javascript
-option batch abort +// Configuration 
-option confirm off + 
-open session +// Local path to download for (keep trailing slash) 
-# Make copy of the most recent file using remote command to new name +var LOCALPATH = "c:\\downloaded\\"; 
-# with unique extension to easily find the file in the temporary directory. +// Remote path to search in (keep trailing slash) 
-call cp `ls -t | head -1` /tmp/`ls -t | head -1`.latest +var REMOTEPATH = "/home/user/"; 
-# Download all the files with the unique extension+// Mask of files to search for 
-# There should be only one, the one just created+var FILEMASK = "*.*"; 
-# While downloading, remove the unique extension+// Session to connect to 
-get /tmp/*.latest *+var SESSION = "session"; 
-# Remove the temporary file. +// Path to winscp.com 
-rm /tmp/*.latest +var WINSCP = "c:\\program files\\winscp\\winscp.com"; 
-exit+ 
 +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 + "\" /log=\"" + logfilepath + "\""); 
 +exec.StdIn.Write( 
 +   "option batch abort\n" + 
 +    "open \"" + SESSION + "\"\n" + 
 +    "ls \"" + REMOTEPATH + FILEMASK + &quot;\"\n" + 
 +    "exit\n"); 
 + 
 +// wait until the script finishes 
 +while (!exec.StdOut.AtEndOfStream) 
 +
 +   WScript.Echo(exec.StdOut.ReadAll()); 
 +
 + 
 +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 the script finishes 
 +while (!exec.StdOut.AtEndOfStream) 
 +
 +    WScript.Echo(exec.StdOut.ReadAll()); 
 +
 + 
 +if (exec.ExitCode != 0) 
 +
 +    WScript.Echo("Error downloading " + filenameLatest); 
 +    WScript.Quit(1); 
 +
 +</code> 
 + 
 +Run the script with command: 
 +<code> 
 +cscript /nologo example.js
</code> </code>

Last modified: by martin