0

我需要生成一个简单的 .BAT 脚本/文件。我以为这很容易,但我错了:-(

BAT 脚本必须(我相信):

  1. 使用 const searchstring 进行搜索
  2. 获取“开始”目录的绝对文件夹路径
  3. 采用文件名掩码/正则表达式进行搜索
  4. 将 const 字符串“附加”到文件的内容中
  5. 递归遍历开始目录和子目录中的所有文件(向下 n 级)搜索(和“处理”)与文件名掩码/正则表达式匹配的任何文件
  6. 搜索“当前”文件的内容(所有可以在 NOTEPAD 中打开的“文本”文件),以查找搜索字符串。搜索字符串可以在文件中的任何位置找到 0、1 或多次。
  7. 如果找到了 searchstring,则什么也不做。如果未找到搜索字符串,则将新字符串附加到文件末尾。瞧!(理论上)

这是我已经拥有的,并没有真正起作用。我有几个可以看到的问题。如何获取“当前文件”以及如何在每个文件之后“重置”ERRORLEVEL。

SET SEARCHSTRING="search for this text"
SET STARTPATH="C:\StartFolder\*"
SET MATCHFILES="*.txt"
SET APPENDSTRING="Appended text"
findstr /c:%SEARCHSTRING% /b /i /d:%STARTPATH% %MATCHFILES%
SET FOUND=%ERRORLEVEL%
REM 0=true, 1=false
IF %FOUND%==1 (
                REM ISSUE: How to get "current" file path???
                REM %APPENDSTRING% >> %CURRENTFILEPATH%
              )

欢迎提出任何问题/建议

干杯

凯尔

4

1 回答 1

0

我通常不喜欢在我的变量值中包含引号。然后我在扩展时根据需要添加封闭引号。而不是set var="value",我喜欢使用set "var=value". 如果我稍后需要用引号括起来,那么我会使用"%var%".

注意:我下面的代码都没有经过测试。可能会有一些愚蠢的错误,但我相信整体概念是合理的

下面的简单脚本应该可以处理大多数情况。使用该/M选项是为了让 FINDSTR 不会浪费时间在每一行中搜索多个 - 一旦找到匹配的单行,它就会退出。

@echo off
setlocal
set "SEARCHSTRING=search for this text"
set "STARTPATH=C:\StartFolder"
set "MATCHFILES=*.txt"
set "APPENDSTRING=Appended text"
for /r "%STARTPATH%" %%F in ("%MATCHFILES%") do (
  >nul findstr /mbic:"%SEARCHSTRING%" "%%~F" || >>"%%F" echo(%APPENDSTRING%
)

但是有很多情况可能会破坏上述代码。

  • 像 unquoted 等有毒字符&在展开|时可能会导致问题%APPENDSTR%

  • "%SEARCHSTRING%"如果 SEARCHSTRING 还包含引号,毒字符可能会在扩展时引起问题。

  • FINDSTR对文字搜索字符串中的字符\和字符有尴尬的转义规则。"

  • 如果 SEARCHSTRING 的某些字节码 > 128,则 FINDSTR 可能无法正常工作。

请参阅Windows FINDSTR 命令有哪些未记录的功能和限制?有关使用 FINDSTR 的复杂性的更多信息

使代码在所有情况下都能正常工作的最简单方法是使用延迟扩展来避免变量值中的毒字符问题,并将搜索字符串存储在临时文件中并使用 FINDSTR/G选项。搜索字符串中的任何\字符都必须转义为\\. 必须在 FOR 循环中禁用延迟扩展,以便包含!的文件名不会损坏。

@echo off
setlocal disableDelayedExpansion
set "SEARCHSTRING=search for this text"
set "STARTPATH=C:\StartFolder"
set "MATCHFILES=*.txt"
set "APPENDSTRING=Appended text"

set "tempFile=%temp%\search%random%_"
setlocal enableDelayedExpansion
>"%tempFile%search.txt" echo(!SEARCHSTRING:\=\\!
>"%tempFile%append.txt" echo(!APPENDSTRING!
endlocal

for /r "%STARTPATH%" %%F in ("%MATCHFILES%") do (
  >nul findstr /mbig:"%tempFile%search.txt" "%%~F" || type "%tempFile%append.txt" >>"%%~F"
)

del "%tempFile%*.txt"
于 2012-10-26T16:51:44.757 回答