我编写了一个批处理文件来替换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)
谢谢。
答案 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
)