![](/img/trans.png)
[英]How to convert a windows batch file into a signle line “cmd /c” command?
[英]How to parse a XML file with Command Line (cmd/batch)
我有一个 XML 文件Testing.Config
具有以下内容:
<?xml version="1.0" encoding="utf-8"?>
<connectionStrings>
<add name="name1" connectionString="user id=id1;password=password1;"/>
<add name="name2" connectionString="user id=id2;password=password2;"/>
<add name="name3" connectionString="user id=id3;password=password3;"/>
</connectionStrings>
我需要解析此文件并在由提供的属性标识的特定标记的属性中获取id
和password
键值对,例如"name=name1"
。
输入:
name=name1
回报:
id=id1
password=password1
@echo off
set "xml_file=test.xml"
set /p search_for=Enter name:
for /f "skip=2 tokens=3,9 delims=;= " %%a in ('find """%search_for%""" "%xml_file%"') do (
set "name=%%~a"
set "pass=%%b"
)
echo name : %name%
echo pass : %pass%
如果所有connectionStrings都在分隔的行上,并且每个字符串都在一行上。更改xml_file
的位置
您也可以尝试使用xpath.bat (根据我的更好选项)-small脚本,它允许您通过xpath表达式获取xml值,而无需使用外部二进制文件:
call xpath.bat connection.xml "//add[@name = 'name1']/@connectionString"
既然你(在问题的评论中)指出powershell也没关系,请将以下代码放在脚本文件中(假设为Foo.ps1
)
param
(
[Parameter(Mandatory=$true)]
[string] $ConfigFilePath,
[Parameter(Mandatory=$true)]
[string] $Name
)
([xml](Get-Content -LiteralPath $ConfigFilePath)).connectionStrings.add |
Where-Object {$_.name -eq $name} |
ForEach-Object {($_.connectionString -split ' ')[1] -split ';'}
然后使用参数运行脚本以获取输出。
万一有人像我一样寻找这个......由npocmaka链接的xpath.bat效果很好,但不适用于文件一网络路径,例如\server\foo\bar.xml。 而且我无法让 Vikus 的 PS 脚本用于属性。 所以...我设法将 Vikus 的 PS 变成了这样:
param
(
[Parameter(Mandatory=$true)]
[string] $XMLFile,
[Parameter(Mandatory=$true)]
[string] $Xpath
)
[xml]$xml = Get-Content -Path $XMLFile
$value = Select-XML -xml $xml -xpath $Xpath
$value.ToString()
然后我将其折叠到此以用于 a.cmd 文件:
set psc="(Select-XML -xml ([xml](Get-Content -Path %xmlfile%)) -xpath %xpath%).ToString()"
for /f %%a in ('powershell %psc%') do set myvar=%%a
尽管值得注意的是 %xmlfile% 和 %xpath% 都不能有空格。 这需要 escaping 所有括号,以便 powershell 命令不必用双引号括起来:
for /F %a in ('powershell ^(Select-XML -xml ^([xml]^(Get-Content -Path "test.xml"^)^) -xpath "/Computers/Computer/Name/@id"^).ToString^(^)') do @echo %a
FWIW,它们都比我原来脆弱的怪物慢得多:
@for /F eol^=^#^tokens^=2^,5^,7^ delims^=^<^>^" %%i in (%xmlfile%) do @(
@if "%targetnodename% ATTR1=" == "%%i" (
set myvar1=%%j
set myvar1=%%k
)
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.