我需要生成一个简单的.BAT脚本/文件。我认为这很容易,但我有多么错: - (
BAT脚本必须(我相信):
这是我已经拥有的,而不是真正的工作。我有几个问题我可以看到。如何获取“当前文件”以及可能还有如何在每个文件后“重置”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%
)
任何问题/建议超过欢迎
干杯
凯尔答案 0 :(得分: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%
)
但是有很多场景可能会破坏上述代码。
在展开&
|
,%APPENDSTR%
等毒药字符可能会导致问题
如果SEARCHSTRING还包含引号,则在展开"%SEARCHSTRING%"
时,毒药字符可能会导致问题。
FINDSTR对文字搜索字符串中的\
和"
个字符设置了尴尬的转义规则。
如果SEARCHSTRING具有某些字节代码,则FINDSTR可能无法正常工作。 128。
有关使用FINDSTR的复杂性的更多信息,请参阅What are the undocumented features and limitations of the Windows FINDSTR command?
使代码在所有情况下都能正常工作的最简单方法是使用延迟扩展来避免变量值中的有毒字符出现问题,并将搜索字符串存储在临时文件中并使用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"