2011-12-18 66 views
0

键入“S:\ Images * .html”| findstr/v签名| findstr/v密封胶| findstr/v construction> S:\ Images \ .html搜索文件夹中的* .html并运行特定代码

我开发了上述文本。我不是批处理脚本的最佳人选,但是我知道如何使用变量(在PHP和C++中)。

我的目标是更新用户的电子邮件签名文件。 (我想删除三行文字)。 为了做到这一点,我想搜索他们的共享驱动器的任何HTML文件,并尝试找到我需要删除的三条线。

这个问题是我不太擅长变量和在批处理脚本中搜索。我想覆盖我正在修改的文件。

回答

1

你是怎么得到这段代码的?您应该学习如何逐步实施解决方案(不管是否是BAT文件),阅读手册,尝试自己并调试问题。

当你尝试你的代码时,你会意识到什么TYPE命令(它不会列出目录)。请参阅“帮助类型”。请使用FOR命令。见HELP FOR,然后尝试这个命令行

FOR %a in (*.HTML) do @echo %a 

,然后读取HELP FINDSTR,并尝试这个命令行

FOR %a in (*.HTML) do @findstr /v "Signature sealants construction" %a 

而你几乎完成。你需要做一些小的修改,把它放在一个.BAT文件中:要在BAT中使用FOR,你需要将%va替换为%% a;添加一些@echo off和其他咒语;在命令行中删除@; ...

将所有拼在一起,泰伊下面的代码

@echo off 
FOR %%a in (*.HTML) do (
    FINDSTR /i /v "Signature sealants construction" %%a >%%~na.html.new 
) 
echo del *.html 
echo ren *.html.new *.html 

测试并修改它以满足您的需求,请记住,这只是一个起点。如果完全正确,请删除ECHO

+2

这看起来很不错,清晰更换del "%%f"线在我的代码,但是,通过[这个问题](http://stackoverflow.com/questions/8366864/windows-7-batch-判断script-for-command-error-bug),可能会出现意外情况。 – 2011-12-19 18:44:18

+0

好点,我做了一些q&d解决方案的编辑。 – 2011-12-19 20:02:32

1
for "eol=: delims=" %%f in ('findstr /s /m /l "Signature sealants construction" "*.html"') do (
    findstr /l /v "Signature sealants construction" "%%f" >"%%f.tmp" 
    del "%%f" 
    ren "%%f.tmp" "%%~nxf" 
) 

上面应该从您要开始搜索的文件夹中运行。外部循环查找包含任何单词的所有html文件。在循环内部,它将每个找到的文件写入一个.tmp文件,去除包含至少一个单词的任何行。然后它只是删除旧文件并将.tmp重命名为原始文件。

如果您希望搜索区分大小写,请将/ i选项添加到两个FINDSTR命令中。

我担心搜索过于笼统。任何单词都可能出现在多个上下文中。这可能会导致灾难性的意外结果。我想你可能需要更具体的模式来搜索。 FINDSTR支持粗糙的正则表达式。如果您可以找出要删除的每行的良好正则表达式,则可以将/ l更改为/ r,并用三个/ c:“regularExpression”参数(每个正则表达式一个参数)替换带引号的搜索字符串。当然,这将对两个FINDSTR命令都完成。如果.html的名称具有某种模式以使其更具选择性,它也可能有所帮助。

最后,不是简单地覆盖原始的.html,而是保留原始副本,以防万一出错。我建议您用

del "%%f.bak" 2>nul 
    ren "%%f" "%%~nxf.bak"