2013-05-09 2 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은 어디에 정의되어 있습니까? 여러 설정 파일이 있다고 가정하면 스크립트를 작성할 필요가 없습니다. 찾기/바꾸기가 가능한 텍스트 편집기이면 충분합니다. –

+0

배치 파일은 텍스트 편집을하기 위해 아주 멋지게 대화해야합니다. 그들은 정말로 그렇게하는 것을 정말로 좋아하지 않습니다. 그것이 가능할 지 여부는 많은 것들에 달려 있습니다. 훨씬 더 세부 사항이 필요하며 사실상 모든 접근법에는 몇 가지 문제가 있습니다. instnce 들어,이 데이터는 모두 한 줄에 있습니까? 선 길이에 ~ 8K의 제한이 있습니다. 특정 문자를 대체하는 것이 문제가 될 수 있습니다. 파일을 여러 줄로 서식을 지정할 수 있습니까? 수정해야 할 서식 파일일까요? – Magoo

+0

실제 위치를 어느 위치에 추가 하시겠습니까? '묘사 '뒤에? – Endoro

답변

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

+0

글쎄 우선은 실제로 10 배입니다. :)하지만 시도 할 때 "값"을 알지 못합니다. 그래서 다른 옵션이 있는데 "sql.server.name"과 대부분의 경우에 사용할 값을 설정하기 때문에 파일을 사용하지 않을 것입니다. ... 그렇게 할 다른 방법이 있다면 나는 정말로 감사 할 것입니다 ... – user2366775

+0

나는 그렇지 않습니다. 알다. 당신은 그것이 무엇인지 모르는 값을 변경하고 싶습니까? 아마도 우리가 문제를 해결하는 방법을 설명해 주면 문제를 해결하는 프로그램을 작성할 수 있습니다. 그러나 문제가 무엇인지를 묻지 마십시오! – Aacini