Plik wsadowy> Javascript> WinSCP> Sprawdź, czy plik istnieje
Mam plik wsadowy, który uruchomi plik .js, który za pomocą WinSCP sprawdza, czy plik istnieje i wraca do pliku wsadowego, jeśli tak jest lub nie.
Problem IS: Zawsze zwraca nie znaleziony, a ja nie mogę zrozumieć dlaczego. Nie jestem pewien, jak użyć symbolu wieloznacznego w tym scenariuszu.
Plik wsadowy wygląda tak:
cscript /nologo file.js
if errorlevel 1 goto notfound
exit
:notfound
(another script to copy a file over)
Na serwerze może istnieć tylko jeden plik naraz. Co dziesięć minut będzie uruchamiany ten plik wsadowy, sprawdź, czy istnieje plik, jeśli nie, skopiuj go.
Plik.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);
}
W linii 4 jest napisane:
var FILEPATH = "../filepath/TSS*";
Ta gwiazda sprawia, że mam problemy. Muszę szukać pliku, który ZACZYNA SIĘ Z TSS, ale na końcu będzie oznaczony znacznikiem czasu. Muszę więc użyć znaku wieloznacznego po TSS.
Tak więc potrzebuję pomocy: Sprawienie, że ten proces zostanie zwrócony, jeśli istnieje jakiś plik z TSS *
Każda pomoc byłaby bardzo mile widziana.
EDYTOWAĆ:
var nodes = doc.selectNodes("//w:file/w:filename[starts-with(@value, 'TSS')]");
Ten kod wydaje się nie działać. Jeśli ten kod zadziałał, wygląda na to, że rozwiąże wszystkie moje problemy.