Stapeldatei> Javascript> WinSCP> Überprüfen Sie, ob eine Datei vorhanden ist

Ich habe eine Batch-Datei, die eine .js-Datei startet, die über WinSCP prüft, ob eine Datei vorhanden ist, und zu der Batch-Datei zurückkehrt, ob dies der Fall ist oder nicht.

Das Problem ist: Es wird immer nicht gefunden, und ich kann nicht herausfinden, warum. Ich bin nicht sicher, wie ich in diesem Szenario einen Platzhalter verwenden soll.

Die Batch-Datei sieht folgendermaßen aus:

cscript /nologo file.js
if errorlevel 1 goto notfound
exit
:notfound
(another script to copy a file over)

Es kann immer nur eine Datei auf dem Server vorhanden sein. Diese Batch-Datei wird also alle zehn Minuten ausgeführt. Überprüfen Sie, ob eine Datei vorhanden ist. Wenn nicht, kopieren Sie eine Datei.

Die file.js:

// Configuration

// Remote file search for
var FILEPATH = "../filepath/TSS*";

// Session to connect to
var SESSION = "[email protected]";

// Path to winscp.com
var WINSCP = "c:\\program files (x86)\\winscp\\winscp.com";

var filesys = WScript.CreateObject("Scripting.FileSystemObject");
var shell = WScript.CreateObject("WScript.Shell");

var logfilepath = filesys.GetSpecialFolder(2) + "\\" + filesys.GetTempName() + ".xml";

var p = FILEPATH.lastIndexOf('/');
var path = FILEPATH.substring(0, p);
var filename = FILEPATH.substring(p + 1);

var exec;

// run winscp to check for file existence
exec = shell.Exec("\"" + WINSCP + "\" /log=\"" + logfilepath + "\"");
exec.StdIn.Write(
"option batch abort\n" +
"open \"" + SESSION + "\"\n" +
"ls \"" + path + "\"\n" +
"exit\n");

// wait until the script finishes
while (exec.Status == 0)
{
WScript.Sleep(100);
WScript.Echo(exec.StdOut.ReadAll());
}

if (exec.ExitCode != 0)
{
WScript.Echo("Error checking for file existence");
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/w:filename[@value='" + filename + "']");

if (nodes.length > 0)
{
WScript.Echo("File found");
// signalize file existence to calling process;
// you can also continue with processing (e.g. downloading the file)
// directly from the script here
WScript.Quit(0);
}
else
{
WScript.Echo("File not found");
WScript.Quit(1);
}

In Zeile 4 heißt es:

var FILEPATH = "../filepath/TSS*";

Dieser Stern gibt mir Probleme, denke ich. Ich muss nach einer Datei suchen, die MIT TSS BEGINNT, aber am Ende wird ein Zeitstempel angebracht. Deshalb muss ich nach TSS nur einen Platzhalter verwenden.

Also, was ich Hilfe brauche, ist: Diesen Prozess zurückgeben, wenn eine Datei mit TSS existiert *

Jede Hilfe wäre sehr dankbar.

BEARBEITEN:

var nodes = doc.selectNodes("//w:file/w:filename[starts-with(@value, 'TSS')]");

Dieser Code scheint nicht zu funktionieren. Wenn dieser Code funktionieren würde, würde er anscheinend alle meine Probleme lösen.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage