2014-05-09 145 views
2

我搜索了一千個示例並嘗試過,但其中沒有一個實際上適用於我。我的要求是相當直接的,我有一個文件 - config.txt的,它有行之一:使用批處理文件編輯文本文件

SQLSERVER =本地主機

我試圖更新該行:

SQLSERVER = MYMACHINE \ sql2012

我在網上查看了一些示例,其中一些只是使用set變量,或者一些不替換,但插入。有一些示例正在寫入新文件,但新文件在每行前面都有行號。我沒有找到一個有用的說明如何編寫批處理腳本,並且沒有任何更新文件批處理腳本適用於我。

如果您留下一些評論,這將會非常有幫助。

在此先感謝

回答

6

編輯 - 適應評論

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    set "config=.\config.txt" 
    set "dbServer=localhost\sql2012" 

    for /f "tokens=*" %%l in ('type "%config%"^&cd.^>"%config%"' 
    ) do for /f "tokens=1 delims== " %%a in ("%%~l" 
    ) do if /i "%%~a"=="sqlServer" (
     >>"%config%" echo(sqlServer=%dbServer% 
    ) else (
     >>"%config%" echo(%%l 
    ) 

    type "%config%" 

    endlocal 

輸入文件被讀取由線(for /f %%l)線,那麼每一行是分割(for /f %%a),並且如果在該行的第一個標記爲「SQLSERVER」,則行被替換,否則原始行被髮送到文件。

用於檢索在第一for循環信息的指令包括:cd.>"%config%",將刪除的文件的內容,所以最終得到的線(已在存儲器由for命令去除它們之前被讀取)被髮送直接到相同的文件。

+0

如果我想傳遞參數來分配sqlServer值,該怎麼辦? 我更新爲: 集DBSERVER =本地主機\ sql2012 .............. SET的SqlServer =%DBSERVER% ,但它不工作 – user3621995

+0

@ user3621995,不知道的代碼在你的評論。查看更新的答案。這是你想要的嗎? –

+0

它實際上工作,感謝您的答覆。之前的問題與文件編碼有關,對於「set」,它在它之前添加了一些特殊字符,所以它不被識別爲命令。我創建了另一個批處理文件,並且複製了所有內容並且工作。 這個腳本只搜索標記,意思是用空格分隔的起始字符串?我有另一個例子,我需要將「localhost」替換爲%dbServer%,但腳本不工作,我認爲它找不到「DatabaseServer」,因爲它在一個令牌的中間,對嗎? – user3621995

5

你可以這樣做:

FINDSTR /I /V /B "sqlServer=" config.txt > config.new 
ECHO sqlServer=myMachine\sql2012 >> config.new 
DEL config.txt 
REN config.new config.txt 

FINDSTR將刪除與sqlServer=開始的所有行並創建一個名爲newfile新文件。

ECHO將在末尾添加一行sqlServer=MyMachine\sql2012

最後兩行刪除您現有的config.txt並將其替換爲前兩行的輸出。

+0

這看起來是正確的,除非你應該爲我們提供一個/ q沒有提示del:'del/q config.txt' – Alex

+0

嗨馬克,腳本也刪除所有其他行,「sqlServer =」是其中一行,還有其他的參數我不想改變,你知道如何保持這些? – user3621995

+0

更改我的腳本的第一行的最後一部分,以便它與您想要刪除的行完全匹配,即FINDSTR/V/B「sqlServer = localhost」如果沒有,編輯您的問題並顯示您的文件外觀。 –