批脚脚本提取两个字符串之间的内容

时间:2017-02-23 16:15:58

标签: windows batch-file

我正在尝试编写此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 =”之后完成所有操作。有一个简单的方法吗?

2 个答案:

答案 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中的字符串不是其中一个关键字,请检查是否同时设置了catalogcatalog。如果是,则这是必需的字符串,因此请指定它。

如果找到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]