2010-11-17 107 views
2

我正在創建一個批處理腳本,它必須循​​環遍歷文件中的行,檢查某個字符串,並且如果這些字符串的匹配前綴是'#'(註釋掉) 。使用批處理腳本處理字符串

我完全新批處理腳本,所有我能走到今天是:

for /f %%j in (CMakeLists.txt) do (
    if "%%j"=="Extensions_AntTweakBar" (
     echo lol1 
    ) 
    if "%%j"=="Extensions_Inspection" (
     echo lol2 
    ) 
    if "%%j"=="Extensions_InspectionBar" (
     echo lol3 
    ) 
) 

所以我現在的問題是,我不知道如何在字符串批處理腳本內運行。如果有人可以幫助我走出這將不勝感激:)

+0

它可以在蝙蝠完成...但你爲什麼選擇它? – 2010-11-17 22:23:11

+0

您能否提供一個示例文件,以便我們可以看到是否存在需要保留的任何文本格式,即空行,縮進等......或者您能否確定地說明這不是我們需要關注的問題? – 2010-12-19 22:35:56

+0

這可以很容易地在普通的舊DOS中完成。我已經做了1000次,如果不是更多。我今天晚上會回到這個問題 - 聖誕節即將來臨! – 2010-12-19 12:49:39

回答

2

你可以使用你想追加的文字,後面跟着你的變量。

C:\>set MY_VAR=Hello world! 
C:\>echo #%MY_VAR% 
#Hello world! 

C:\>set MY_VAR=#%MY_VAR% 
C:\>echo %MY_VAR% 
#Hello world! 

如果你只是在做回聲,那很好。 echo #%%j會做你所需要的。

但是,如果要將行設置爲變量,則必須使用enable delayed expansion。將setlocal ENABLEDELAYEDEXPANSION添加到文件的頂部,然後用!而不是%來包圍變量。例如(和通知,我已經添加了delims=把整條生產線在%%j而不是第一個字就行了):

@echo off 

setlocal ENABLEDELAYEDEXPANSION 

set LINE= 
for /f "delims=" %%j in (CMakeLists.txt) do (
    set LINE=%%j 
    if "%%j"=="Extensions AntTweakBar" (
     set LINE=#%%j 
    ) 
    if "%%j"=="Extensions Inspection" (
     set LINE=#%%j 
    ) 
    if "%%j"=="Extensions InspectionBar" (
     set LINE=#%%j 
    ) 

    echo !LINE! 
) 

鑑於此輸入文件:

Extensions AntTweakBar 
some text 
Extensions Inspection 
Extensions What? 
some more text 
Extensions InspectionBar 
Extensions InspectionBar this line doesn't match because delims= takes all text 
even more text 

上述腳本產生此輸出:

C:\>comment.bat 
#Extensions AntTweakBar 
some text 
#Extensions Inspection 
Extensions What? 
some more text 
#Extensions InspectionBar 
Extensions InspectionBar this line doesn't match because delims= takes all text 
even more text 

並且當然刪除@echo off將幫助您調試問題。

但是所有這一切都說明了,你所處的極限可以通過批處理字符串處理完成。如果您仍想使用批處理命令,則可能需要開始將行寫入臨時文件,並使用findstr和正則表達式。

+0

這幾乎是我現在正在做的,自己修復它:) - 但+1 :) – Skeen 2010-11-19 06:34:59

0

沒有更好的理解你希望你的循環或者什麼你的CMakeLists.txt文件看起來像裏面是什麼,試試這對於初學者:

FINDSTR "SOMETHING" %%J && ECHO #%%J || ECHO %%J 

& &使得第二命令(ECHO)以第一命令退出而沒有錯誤狀態爲條件,並且||就像一個邏輯OR,它在第一個沒有時運行。

真的,對於修改文本文件的內部,您可能會更好使用sedawk - win32二進制文件可在UnxUtils項目中找到。

+0

我知道這一點,但問題是,我不能有一個依賴作爲sed或awk,否則將是做正確的事情。 - 我用更多的代碼更新了主代碼,這似乎工作,它現在找到了3條重要的代碼行,但我如何在它們前面添加'#'? – Skeen 2010-11-17 22:34:35

+0

@Skeen - 你能否依賴PowerShell或者更強大的文本處理能力? – Goyuix 2010-11-18 15:50:57