Пакетный файл - код для редактирования строки между строками в файле dtsconfig / xml - PullRequest
1 голос
/ 14 марта 2011

Я написал командный файл для замены определенных строк в файле dtsConfig.Теперь, из того, что я могу собрать, пакет не может напрямую редактировать файлы dtsconfig, поэтому я использую обходной путь, который работает, чтобы сначала преобразовать файлы .dtsConfig в .xml, отредактировать их и преобразовать обратно.

Однако у меня есть много файлов .dtsconfig с несколькими различными строками, которые я хочу изменить

например, строка SERVER_NAME

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

Мой кодниже можно изменить значение SERVER_NAME, но вместо этого я бы предпочел изменить содержимое между Data Source = и; Integrated Security.чтобы я мог сделать это для большого количества файлов dtsConfig, которые могут иметь разные имена серверов

Возможно ли это с помощью пакета?

Это мой код ниже:


@echo off > *.xml
setLocal DisableDelayedExpansion</p>

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

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

<p>:: Rename all .dtsConfig files to .xml to enable batch to work with them
ren *.dtsConfig *.xml</p>

<p>:: set the new server name
set dataSource=NEW_SERVER_NAME</p>

<p>@echo off > ConfigFile.dtsConfig
setLocal DisableDelayedExpansion</p>

<p>if exist ConfigFile.dtsConfig del ConfigFile.dtsConfig</p>

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

<code>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 Ответ

1 голос
/ 14 марта 2011

Попробуйте что-то вроде этого вместо вашего текущего цикла замены.

Он проверяет каждую строку на наличие строки «Источник данных», если обнаружил, что строка разбивает строку на заголовок «... Источник данных» и хвост «; ...», эффективно удаляет старуючасть источника данных.
Пример.
<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
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...