我正在尝试编写此Batch脚本以从XML文件中提取两个参数,如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<!--<var name="SqlConnection" value="data source=SERVERNAME;initialcatalog=DB_NAME;user id=JackDaniels;password=G235X" />-->
<var name="SqlConnection" value="data source=SERVERNAME;initial catalog=DB_Name;Integrated Security=SSPI" />
我的目标是从未注释掉的行中提取SERVERNAME和DB_NAME。
到目前为止,我的代码看起来像这样:
@echo off
setlocal enableextensions disabledelayedexpansion
set "connectionString="
set result=""
set "INPUT_FILE=DBConnection.config"
FOR /F "tokens=* delims=<var eol=!" %%x in (%INPUT_FILE%) DO (
ECHO %%x
)
PAUSE
我只是不确定如何在“data source =”和“initial catalog =”之后完成所有操作。有一个简单的方法吗?
答案 0 :(得分:1)
@ECHO Off
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "filename1=%sourcedir%\q42420941.txt"
FOR %%v IN (initial catalog data source initial_catalog data_source) DO SET "%%v="
FOR /f "delims=<>" %%z IN ('findstr /B /L /C:"\<var name" "%filename1%"') DO (
FOR %%y IN (%%z) DO (
FOR %%a IN (%%~y) DO (
SET "alive=Y"
FOR %%m IN (initial catalog data source) DO IF /i "%%a"=="%%m" SET "alive="&set %%a=Y
IF DEFINED alive (
IF DEFINED initial IF DEFINED catalog SET "initial_catalog=%%a"
IF DEFINED data IF DEFINED source SET "data_source=%%a"
)
IF DEFINED catalog IF NOT DEFINED initial SET alive=y
IF DEFINED source IF NOT DEFINED data SET alive=y
IF DEFINED alive FOR %%v IN (initial catalog data source) DO set "%%v="
)
)
)
ECHO %initial_catalog% and %data_source%
GOTO :EOF
您需要更改sourcedir
的设置以适合您的具体情况。
我使用了一个名为q42420941.txt
的文件,其中包含我的测试数据。
首先,清除变量名称。
接下来,解析通过findstr
的每一行,该/L
正在查找/B
字面/c:
以\
字符序列&#34开头的行;&lt;由>
转义并获取由<
或<>
分隔的第一个标记。
这样可以巧妙地从字符串中删除笨拙的%%z
,并将所选行的内容分配给for
接下来,使用简单的%%y
将行中的每个标记显示为%%y
。
然后将%%a
引用的引号分配给set
。
搜索与关键字匹配的匹配项,并alive
找到相同名称的变量。如果找到关键字,请清除%%a
。
如果initial
中的字符串不是其中一个关键字,请检查是否同时设置了catalog
和catalog
。如果是,则这是必需的字符串,因此请指定它。
如果找到initial
但未找到alive
,则标记为alive
如果仍然设置=
,那么我们可以清除标志并等待另一个序列的开始。
好的 - 它有它的缺点。如果其中一个是四个关键字之一(不太可能),它就不会检测到initial_catalog / data_source,它假定所需数据是两个关键字后面的标记 - for
成为{{1}中的分隔符列表。
答案 1 :(得分:0)
由于你们许多人认为批处理不是这种方法的合适方式,所以我决定使用PowerShell,只用几行和一些正则表达式就能完成我想要的工作!
$configPath = $PSScriptRoot + "DBConnection.config"
[xml]$XmlDocument = Get-Content -Path $configPath
$dataSource = $XmlDocument.var.Attributes[1].Value.ToString() # Extract the uncommented line, and the second attribute "value"
$serverName = ($dataSource -split 'data source=([^;]*);')[1]
$db_name = ($dataSource -split 'initial catalog=([^;]*);')[1]
$user_id = ($dataSource -split 'id=([^;]*);')[1]
$user_pass = ($dataSource -split 'password=([^;]*)')[1]