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 + "\"\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> | ||