批处理文件 - 用于编辑dtsconfig / xml文件中字符串之间的字符串的代码

时间:2011-03-14 12:03:52

标签: batch-file

我编写了一个批处理文件来替换dtsConfig文件中的某些字符串。 现在从我可以收集到的,批处理不能直接编辑dtsconfig文件,所以我正在使用的解决方法是 首先将.dtsConfig文件转换为.xml,编辑它们并将其转换回来。

但是我有很多.dtsconfig文件,包含我想要更改的几个不同的字符串

e.g。字符串SERVER_NAME

<ConfiguredValue> Data Source=SERVER_NAME;Integrated Security=True;</ConfiguredValue>

我的代码可以更改SERVER_NAME值,但我更愿意更改其间的内容 数据源=和;集成安全性。所以我可以为许多可能具有不同服务器名称的dtsConfig文件执行此操作

批次可以实现吗?

这是我的代码:


@echo off > *.xml
setLocal DisableDelayedExpansion

:: make a copy of the .dtsConfig files set str="C:\dtsconfig\copyArea"

:: Copy all dtsConfig files into the backup directory xcopy "*.dtsConfig" %str1% /E /I

:: Rename all .dtsConfig files to .xml to enable batch to work with them ren *.dtsConfig *.xml

:: set the new server name set dataSource=NEW_SERVER_NAME

@echo off > ConfigFile.dtsConfig setLocal DisableDelayedExpansion

if exist ConfigFile.dtsConfig del ConfigFile.dtsConfig

for /f "tokens=* delims= " %%G in (ConfigFile.xml) do ( set str=%%G

setLocal EnableDelayedExpansion :: set the string "SERVER_NAME" to be the dataSource defined above set str=!str:SERVER_NAME=%dataSource%! :: generate a new dtsConfig file with the rename in place >> ConfigFile.dtsConfig echo(!str! endlocal)
setLocal EnableDelayedExpansion :: set the string "SERVER_NAME" to be the dataSource defined above set str=!str:SERVER_NAME=%dataSource%! :: generate a new dtsConfig file with the rename in place >> ConfigFile.dtsConfig echo(!str! endlocal)

谢谢。

1 个答案:

答案 0 :(得分:1)

尝试这样的事情而不是你当前的替换循环。

它检查字符串“Data Source”的每一行,如果它发现字符串将该行分为头部“...数据源”和尾部“; ...”,有效地删除旧部分数据来源。

<ConfigValue> Data Source=SERVER_NAME;Integrated Security=True;</ConfigValue>
分裂为 head=<ConfigValue> Data Source
tail=;Integrated Security=True;</ConfigValue>

@echo off
setLocal DisableDelayedExpansion
set "dataSource=NEW DATASOURCE"
for /f "tokens=* delims= " %%G in (ConfigFile.xml) do ( 
    set "line=%%G"
    setLocal EnableDelayedExpansion
    REM set the string "SERVER_NAME" to be the dataSource defined above
    set str=!str:SERVER_NAME=%dataSource%!

    set "newLine=!line:*Data Source=!"
    if !newLine! NEQ !line! (
        call :length lenNew newLine
        call :length lenLine line
        set /a headLen=lenLine-lenNew
        for %%n in (!headLen!) do (
          set "head=!line:~0,%%n!"
        )
        set "tail=!newLine:*;=!"
        set "newLine=!head!=%dataSource%;!tail!"
    )

    REM generate a new dtsConfig file with the rename in place
     (echo(!newLine!)
    endlocal
)
goto :eof

:length <resultVar> <stringVar>
(   
    setlocal EnableDelayedExpansion
    set "s=!%~2!#"
    set "len=0"
    for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
        if "!s:~%%P,1!" NEQ "" ( 
            set /a "len+=%%P"
            set "s=!s:~%%P!"
        )
    )
)
( 
    endlocal
    set "%~1=%len%"
    exit /b
)

顺便说一下。在括号块内使用::注释样式不是一个好主意,因为标签在块中的工作方式不同,更好的是使用REM

(
echo 1
:label1 & echo invisble
:label2 & echo visible
echo 2
)

(
echo 3
:label1 creates a syntax error, befor the block executes

echo 4
)