我有一个批处理文件,它将启动一个.js文件,该文件通过WinSCP检查文件是否存在,如果有,则返回批处理文件。
问题是:它总是返回未找到,我无法弄清楚原因。我不确定如何在这种情况下使用通配符。
批处理文件如下所示:
cscript /nologo file.js
if errorlevel 1 goto notfound
exit
:notfound
(another script to copy a file over)
服务器上一次只能存在一个文件。所以每隔十分钟,这个批处理文件就会运行,检查是否有文件,如果没有,请复制一个。
file.js:
// Configuration
// Remote file search for
var FILEPATH = "../filepath/TSS*";
// Session to connect to
var SESSION = "mysession@someplace.come";
// 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);
}
第4行说:
var FILEPATH = "../filepath/TSS*";
我认为那个明星是给我带来问题的。我需要查找一个STARTS WITH TSS的文件,但最后会加上时间戳。所以我需要在TSS之后使用通配符。
所以我需要帮助的是:如果任何文件存在TSS *
,则此过程返回true非常感谢任何帮助。
编辑:
var nodes = doc.selectNodes("//w:file/w:filename[starts-with(@value, 'TSS')]");
此代码似乎不起作用。如果这段代码有效,似乎它可以解决我所有的问题。
答案 0 :(得分:1)
您需要更正var nodes...
行中的xpath表达式。
尝试这样的事情:
doc.setProperty("SelectionLanguage", "XPath"); //added in edit
var nodes = doc.selectNodes("//w:file/w:filename[starts-with(@value, '" + filename + "')]");
并从FILEPATH
删除星号。
注意:要使用XPath
作为查询语言,需要第一行,而不是默认(和旧)XSLPattern
,它不支持starts-with
或{{}等方法1}}。
答案 1 :(得分:1)
您可以使用stat
command。您甚至可以将WinSCP脚本内联到批处理文件中:
@echo off
set REMOTE_PATH=/home/user/test.txt
winscp.com /command ^
"option batch abort" ^
"open mysession" ^
"stat %REMOTE_PATH%" ^
"exit"
if errorlevel 1 goto error
echo File %REMOTE_PATH% exists
rem Do something
exit 0
:error
echo Error or file %REMOTE_PATH% not exists
exit 1
另一种方法是使用Session.FileExists
中的WinSCP .NET assembly。
有关详细信息,请参阅WinSCP文章Checking file existence。