从XML文件中读取当前目录

时间:2015-07-31 12:29:52

标签: xml batch-file

我有一个用于参数文件的XML文件(例如,根据服务器运行批处理文件来说明操作的路径,因此我可以在任何地方使用相同的批处理文件)
例如,我有XML文件名" Global.DeployParameters.xml"看起来像:

<?xml version="1.0" encoding="utf-8"?>
<parameters>
    <deploy>
        <SoftwareToInstallPaths>
            <softwarepath>
                C:\Software
            </softwarepath>

在我的批处理文件中,我有这个找到它并将变量%softwarepath%设置为读取&#34; C:\ Software&#34;

for /f "tokens=1,2 delims=:" %%n in ('findstr /n /i /c:"<softwarepath>" "Global.DeployParameters.xml"') do (
for /f "tokens=*" %%l in ('type "Global.DeployParameters.xml" ^| more +%%n') do set "softwarepath=%%l" & goto endLoop
)
:endLoop

并在同一个批处理文件中,如果我这样做:

COPY "C:\test\*.*" "%softwarepath%"

如果可以正常工作并将文件复制到批处理文件所在的位置,但是如果我将XML文件更改为

<softwarepath>
    %~dp0..
</softwarepath>

说,复制&#34; C:\ test \&#34;的内容到上面的文件夹级别&#34;批处理文件当前路径&#34;相反,它会使一个文件名为&#34;%~dp0&#34;批处理文件所在的位置,但如果我在批处理文件中硬拷贝&#34;%~dp0 ..&#34;它会工作。

我无法对此进行硬编码,因为它在每台服务器上的位置不同,因此需要从该特定服务器的XML文件中读取。如何让它将XML文本作为命令而不是文字文本阅读?

1 个答案:

答案 0 :(得分:1)

而不是

do set "softwarepath=%%l"

......你应该

do call set "softwarepath=%%l"

扩展%%l另一个深度。

我还建议将XML解析为XML,而不是将其标记化并将其作为文本进行抓取。如果您将其解析为XML,那么您的脚本的成功将不会取决于XML是否被美化,丑化,缩小等等。我知道这是更多代码,但它也更能抵抗XML文件中的更改,而不会明显放弃任何效率。

@if (@CodeSection == @Batch) @then

@echo off
setlocal

set "XMLfile=test.xml"
set "node=softwarepath"

for /f "delims=" %%I in (
    'cscript /nologo /e:JScript "%~f0" "%XMLfile%" "%node%"'
) do call set "%%I"

echo Software path: %softwarepath%..

rem // put your copy statement and whatever else you wish here.

goto :EOF
@end // end batch / begin JScript chimera

String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ''); }

var DOM = WSH.CreateObject('Microsoft.XMLDOM'),
    args = { file: WSH.Arguments(0), node: WSH.Arguments(1) },
    XPath = "//" + args.node + "/text()";

DOM.load(args.file);
DOM.async = false;
DOM.setProperty('SelectionLanguage', 'XPath');

if (DOM.parseError.errorCode) {
    var e = DOM.parseError;
    WSH.StdErr.WriteLine('Error in ' + args.file + ' line ' + e.line + ' char '
        + e.linepos + ':\n' + e.reason + '\n' + e.srcText);
    WSH.Quit(1);
}

for (var d = DOM.selectNodes(XPath), i = 0; i < d.length; i++)
    WSH.Echo(args.node + '=' + d[i].nodeValue.trim());

作为奖励,如果您不仅要编写XML脚本,而且还需要编写modifying and saving it脚本,则只需要进行微小的更改。