【问题标题】:Reading Current Directory from XML file从 XML 文件中读取当前目录
【发布时间】:2015-07-31 21:54:27
【问题描述】:

我有一个用于我的参数文件的 XML 文件(例如,说明操作事物的路径,具体取决于运行批处理文件的服务器,因此我可以在任何地方使用相同的批处理文件)
例如,我的 XML 文件名“Global.DeployParameters.xml”如下所示:

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

在我的批处理文件中,我找到它并将变量 %softwarepath% 设置为读取“C:\Software”

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>

也就是说,将“C:\test\”的内容复制到“批处理文件当前路径”所在的文件夹级别,而不是创建一个与批处理文件同名的文件“%~dp0”位于但如果我在批处理文件“%~dp0..”中硬拷贝它会起作用。

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

【问题讨论】:

  • 不明白.. %~dp0 始终可以从脚本中访问,您不需要从 xml 中读取。
  • 我知道确实如此,在某些服务器上,我需要将文件复制到的驱动器不在批处理文件所在的位置。但是在某些服务器上它需要是这样的,并且有多个服务器可以这样做

标签: xml batch-file


【解决方案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 的脚本,则只需进行微小的更改。

【讨论】:

  • 谢谢,调用 set "softwarepath=%%l" 正是我所需要的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-04
  • 1970-01-01
  • 1970-01-01
  • 2015-04-21
  • 1970-01-01
  • 2019-07-08
  • 1970-01-01
相关资源
最近更新 更多