批处理文件>的JavaScript>的WinSCP>检查文件是否存在(Batch

2019-09-01 18:31发布

我有一个批处理文件,将推出一个.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*";

那星是什么给我的问题,我想。 我需要寻找其开始与TSS文件,但将有上涨了结束时间标记。 所以,我只是需要使用通配符TSS之后。

所以我需要的就是帮助:如果任何文件与TSS存在使该方法返回真*

任何帮助将非常感激。

编辑:

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

此代码似乎不起作用。 如果此代码的工作,好像能解决我的所有问题。

Answer 1:

您需要更正XPath表达式var nodes...线。 尝试是这样的:

doc.setProperty("SelectionLanguage", "XPath"); //added in edit
var nodes = doc.selectNodes("//w:file/w:filename[starts-with(@value, '" + filename + "')]");

从删除星号FILEPATH

注意:第一行是必需的,以便使用XPath的查询语言,而不是默认的(老) XSLPattern不支持的方法,如starts-withcontains

SelectionLanguage属性 (MDSN) 。



Answer 2:

您可以使用stat命令 。 你甚至可以在内嵌脚本的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组件 。


有关详细信息,请参阅文章的WinSCP 检查文件是否存在 。



文章来源: Batch File > Javascript > WinSCP > Check if file exists