2010-11-17 161 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