2013-05-09 37 views
1

这里的config文件的某些部分,我有编辑config文件:是否可以使用批处理脚本

<cs.components> 
      <clear/> 
      <cs.component name="Security"/> 
      <cs.configitems> 
       <cs.configitem name="sql.server.name" value="some_name" type="String" description=""/> 
       <cs.configitem name="sql.server.database" value="DB_name" type="String" description=""/> 
       <cs.configitem name="sql.user" value="user_name" type="String" description=""/> 
       <cs.configitem name="sql.pass" value="pass" type="String" description=""/> 
    </cs.components> 

所以基本上我想有相应的名称* * some_name编辑文件=服务器1; DB_name =服务器1上的真实数据库等等...... 任何帮助将不胜感激!

+0

在哪里输入来自哪里?含义some_name和DB_name定义在哪里?假设有多个配置文件,否则你不需要编写脚本。任何带查找/替换的文本编辑器就足够了。 – 2013-05-09 15:15:17

+0

为了进行文本编辑,需要非常非常好地讨论批处理文件。他们确实不喜欢这样做。是否可能取决于很多事情。需要更多的细节,几乎所有的方法都会遇到一些问题。就此而言,这些数据都在一条线上吗?线路长度有8K的限制。代替某些字符可能是一个问题。可以将文件格式化为多行 - 可能要修改的模板? – Magoo 2013-05-09 15:32:34

+0

你想在什么位置添加实名? 'description'后面? – Endoro 2013-05-09 17:38:38

回答

0

这是我的FindandReplace.cmd脚本。它使用VBScript来克服批量施加的限制。像这样称呼它FindAndReplace <searchstring> <replacestring> <filename or Wildcard>它是区分大小写的。你让批处理文件后,你会这样称呼它:

FindAndReplace some_name some_new_name *.config 
    FindAndReplace DB_name DB_new_name *.config 


::FindAndReplace.cmd 
@echo off 
for /f "tokens=*" %%a in ('dir %~3 /b /a-d /on') do (
pushd %~dp0 
if not exist _.vbs goto :MakeReplace 
<%%a cscript /nologo _.vbs "%~1" "%~2" "%~3">new.txt 
move /Y new.txt %%~nxa > NUL 
popd 
) 
del _.vbs 
goto :eof 

:MakeReplace 
>_.vbs echo Wscript.StdOut.Write Replace(WScript.StdIn.ReadAll,Wscript.arguments(0), Wscript.arguments(1)) 
2

下面的批处理文件是程序的初步版本,实现你想要的。输入和输出文件的名称在程序中是硬编码的,但是可以改变它们以在参数中给出它们或自动处理由通配符选择的所有文件。该程序删除空行并在文件中包含惊叹号时失败,但如果需要,这些限制可能会被修复。

@echo off 
setlocal EnableDelayedExpansion 

rem Save replacement strings 
set i=0 
:nextParam 
    if "%~1" equ "" goto endParams 
    set /A i+=1 
    set "replace[!i!]=%~1" 
    shift 
goto nextParam 
:endParams 

rem Process the file 
(for /F "delims=" %%a in (input.txt) do (
    set "line=%%a" 
    for /L %%i in (1,1,%i%) do (
     for /F "delims=" %%r in ("!replace[%%i]!") do (
     set "line=!line:%%r!" 
    ) 
    ) 
    echo !line! 
)) > output.txt 

要使用此程序,请将用引号括起来的替换字符串作为参数。例如:

replace.bat "some_name=server 1" "DB_name=A real database on Server 1" 

输出:

<cs.components> 
      <clear/> 
      <cs.component name="Security"/> 
      <cs.configitems> 
       <cs.configitem name="sql.server.name" value="server 1" type="String" description=""/> 
       <cs.configitem name="sql.server.database" value="A real database on Server 1" type="String" description=""/> 
       <cs.configitem name="sql.user" value="user_name" type="String" description=""/> 
       <cs.configitem name="sql.pass" value="pass" type="String" description=""/> 
    </cs.components> 
+0

+1,很好的代码和有用的。 – Endoro 2013-05-09 21:12:15

+0

那么首先真的是10倍你:)但当我尝试它,它发生我,我不会知道“值”...所以有任何其他选项,我第一次找到“sql.server.name”和那么我设置它的价值,因为在大多数情况下,我将使用它,我不会知道它的文件是什么...我真的很感谢,如果有另一种方式去做... – user2366775 2013-05-10 07:55:41

+0

我不理解。你想改变一个你不知道它是什么的价值吗?也许如果你解决你的问题,我们可能会写一个程序来解决你的问题,但是不要问我们你的问题是什么! – Aacini 2013-05-11 22:46:23