如何使用 FindStr 排除某些内容?

How do I exclude something from showing up with FindStr?

我需要查找多个字符串,但我查找的字符串标记为在批处理本身中。我搜索字符串 Incognito 和包含它标志的批处理。我该如何防止这种情况?


编辑:这是我当前代码的一个片段。基本上它会打开文本文件并在其中显示这个批处理文件和其他东西,这很好,但我不需要它来标记这个批处理文件。

findstr /i /s /m "Obligatory" *.* > str-unfixed.txt
if %errorlevel%==0 (
Call :TypeWriter "Obligatory Strings Found."
) else (
Call :TypeWriter "No Obligatory Strings Found."
)
start "" "C:\Users\%USERNAME%\Desktop\str-unfixed.txt"

不用担心 TypeWriter,这只是一个片段。


Edit2:感谢您对 Mofi 的编辑,但它在控制台空白且未完成。 完整的脚本。开始了。

@echo off
goto Next
::*************************************************************
:TypeWriter
echo(
(
echo strText=wscript.arguments(0^)
echo intTextLen = Len(strText^)
echo intPause = 30
echo For x = 1 to intTextLen
echo     strTempText = Mid(strText,x,1^)
echo     WScript.StdOut.Write strTempText
echo     WScript.Sleep intPause
echo Next
)>%tmp%\%~n0.vbs
@cscript.EXE /noLogo "%tmp%\%~n0.vbs" "%~1"
echo(
exit /b
::**************************************************************
:Next
@echo off
set "OutputFile=%USERPROFILE%\Desktop\str-unfixed.txt"
%SystemRoot%\System32\findstr.exe /i /s /m "Vape" *.* | %SystemRoot%\System32\findstr.exe /E /L /V /C:"%~nx0" >"%OutputFile%"
for %%I in ("%OutputFile%") do if %%~zI == 0 goto VapeNoFileFound
for %%I in ("%OutputFile%") do if %%~zI == 1 goto VapeFileFound
:VapeFileFound
Call :TypeWriter "Vape Strings Found."
goto Kurium
:VapeNoFileFound
Call :TypeWriter "No Vape Strings Found."
goto Kurium

:Kurium
set "OutputFile=%USERPROFILE%\Desktop\str-unfixed.txt"
%SystemRoot%\System32\findstr.exe /i /s /m "Kurium" *.* | %SystemRoot%\System32\findstr.exe /E /L /V /C:"%~nx0" >>"%OutputFile%"
for %%I in ("%OutputFile%") do if %%~zI == 0 goto KuriumNoFileFound
for %%I in ("%OutputFile%") do if %%~zI == 1 goto KuriumFileFound
:KuriumFileFound
Call :TypeWriter "Kurium Strings Found."
goto Spook
:KuriumNoFileFound
Call :TypeWriter "No Kurium Strings Found."
goto Spook

:Spook
set "OutputFile=%USERPROFILE%\Desktop\str-unfixed.txt"
%SystemRoot%\System32\findstr.exe /i /s /m "Spook" *.* | %SystemRoot%\System32\findstr.exe /E /L /V /C:"%~nx0" >>"%OutputFile%"
for %%I in ("%OutputFile%") do if %%~zI == 0 goto SpookNoFileFound
for %%I in ("%OutputFile%") do if %%~zI == 1 goto SpookFileFound
:SpookFileFound
Call :TypeWriter "Spook Strings Found."
goto Aimassist
:SpookNoFileFound
Call :TypeWriter "No Spook Strings Found."
goto Aimassist

:Aimassist
set "OutputFile=%USERPROFILE%\Desktop\str-unfixed.txt"
%SystemRoot%\System32\findstr.exe /i /s /m "Aimassist" *.* | %SystemRoot%\System32\findstr.exe /E /L /V /C:"%~nx0" >>"%OutputFile%"
for %%I in ("%OutputFile%") do if %%~zI == 0 goto AANoFileFound
for %%I in ("%OutputFile%") do if %%~zI == 1 goto AAFileFound
:AAFileFound
Call :TypeWriter "Aim Assist Strings Found."
goto Triggerbot
:AANoFileFound
Call :TypeWriter "No Aim Assist Strings Found."
goto Triggerbot

:Triggerbot
set "OutputFile=%USERPROFILE%\Desktop\str-unfixed.txt"
%SystemRoot%\System32\findstr.exe /i /s /m "Triggerbot" *.* | %SystemRoot%\System32\findstr.exe /E /L /V /C:"%~nx0" >>"%OutputFile%"
for %%I in ("%OutputFile%") do if %%~zI == 0 goto TRNoFileFound
for %%I in ("%OutputFile%") do if %%~zI == 1 goto TRFileFound
cscript //nologo "C:\Users\%USERNAME%\Desktop\dedup.vbs" < "C:\Users\%USERNAME%\Desktop\str-unfixed.txt" > "C:\Users\%USERNAME%\Desktop\str-fixed.txt"
del /s /q "C:\Users\%USERNAME%\Desktop\str-unfixed.txt" > nul
:TRFileFound
Call :TypeWriter "Triggerbot Strings Found."
start "" "C:\Users\%USERNAME%\Desktop\str-fixed.txt"
:TRNoFileFound
Call :TypeWriter "No Triggerbot Strings Found."
start "" "C:\Users\%USERNAME%\Desktop\str-fixed.txt"

pause > nul
::************************************************

如果你需要dedup.vbs:

Set Inp = WScript.Stdin
Set Outp = Wscript.Stdout
Set Dict = CreateObject("Scripting.Dictionary")
Do Until Inp.AtEndOfStream
    On Error Resume Next
    Line=Inp.readline
    Dict.Add Line, ""
Loop
For Each thing in Dict.Keys()
    Outp.writeline thing
Next

Edit3:谢谢 Mofi!

我的问题:需要让文本文档中的项目显示在 cmd 上 window。

脚本:

@echo off
goto Next
::*************************************************************
:TypeWriter
echo(
(
echo strText=wscript.arguments(0^)
echo intTextLen = Len(strText^)
echo intPause = 30
echo For x = 1 to intTextLen
echo     strTempText = Mid(strText,x,1^)
echo     WScript.StdOut.Write strTempText
echo     WScript.Sleep intPause
echo Next
)>%tmp%\%~n0.vbs
@cscript.EXE /noLogo "%tmp%\%~n0.vbs" "%~1"
echo(
exit /b
::**************************************************************
:Next
@echo off
findstr /i /s /m /C:"Vape" /C:"Kurium" /C:"Spook" /C:"Aimassist" /C:"Triggerbot" /C:"Smoothaim" *.* > str-unfixed.txt
cscript //nologo "C:\Users\%USERNAME%\Desktop\dedup.vbs" < "C:\Users\%USERNAME%\Desktop\str-unfixed.txt" > "C:\Users\%USERNAME%\Desktop\str-fixed.txt"
if %errorlevel%==0 (
Call :TypeWriter "Blacklisted Strings Found."
start "" "C:\Users\%USERNAME%\Desktop\str-fixed.txt"
) else (
Call :TypeWriter "No Blacklisted Strings Found."
start "" "C:\Users\%USERNAME%\Desktop\str-fixed.txt"
)
pause > nul
::************************************************

可以使用以下代码过滤掉批处理文件:

@echo off
set "OutputFile=%USERPROFILE%\Desktop\str-unfixed.txt"
%SystemRoot%\System32\findstr.exe /I /M /S "Obligatory" *.* | %SystemRoot%\System32\findstr.exe /E /L /V /C:"%~nx0" >"%OutputFile%"
for %%I in ("%OutputFile%") do if %%~zI == 0 goto NoFileFound

call :TypeWriter "Obligatory strings found."
start "" "%OutputFile%"
set "OutputFile="
goto :EOF

:NoFileFound
del "%OutputFile%"
set "OutputFile="
call :TypeWriter "No obligatory string found."
goto :EOF

:TypeWriter
echo %~1

第一个 FINDSTR 的输出被第二个 FINDSTR 过滤,输出所有不以搜索的批处理文件名称结尾的行作为区分大小写的文字字符串。

FOR命令用于检查输出文件的文件大小

输出文件是否为空文件,即文件大小等于 0 字节,除批处理文件本身外,在任何文件中均未找到字符串 Obligatory,导致删除输出文件并打印相应的文件留言。

否则在打印找到字符串的消息后,将在与文件扩展名 .txt 关联的应用程序中打开输出文件。

上面的批处理文件在子目录而不是整个驱动器 C: 上针对两种情况进行了测试,因为它可能需要很长时间才能在 C: 上完成。驱动器 C: 上有数十万个文件,当使用 *.* 作为文件名模式并从驱动器 C:.

的根目录开始时,总共有几十个 GiB 来搜索字符串

编辑 1:定义要分两部分查找的字符串

如上所述,一个更好的解决方案是避免搜索字符串出现在批处理文件中。这可以通过使用字符串的环境变量来完成,分两步查找和定义环境变量的值。

@echo off
setlocal
set "OutputFile=%USERPROFILE%\Desktop\str-unfixed.txt"

set "StringToFind=Obli"
set "StringToFind=%StringToFind%gatory"

%SystemRoot%\System32\findstr.exe /I /M /S "%StringToFind%" *.* >"%OutputFile%"

if errorlevel 1 (
    del "%OutputFile%"
    call :TypeWriter "No %StringToFind% strings found."
) else (
    call :TypeWriter "%StringToFind% strings found."
    start "" "%OutputFile%"
)

endlocal
goto :EOF

:TypeWriter
echo %~1

这个批处理文件也搜索 Obligatory,但它不包含这个字符串,只有 Obligatory.


编辑 2:定义要查找的字符串,省略转义字符

这是另一种解决方案,其中将要查找的多个字符串分配给具有转义字符的环境变量 ^ 在搜索字符串中间的任何位置排除批处理文件。

^ 在将搜索字符串分配给环境变量时被 Windows 命令解释器删除,因为在双引号字符串中找不到。请注意,此解决方案需要行

set SearchX=S^earch String

没有 1 个或多个尾随 spaces/tabs,因为尾随白色space(s) 也将分配给环境变量。搜索将不再像预期的那样工作,这些行末尾的不可见 space 或水平制表符作为搜索字符串的一部分。

此外,此批处理代码首先将 FINDSTR 找到的每个文件名输出到控制台 window,然后将文件名重定向到输出中,其中包含 6 个搜索字符串之一文本文件。

@echo off
setlocal EnableExtensions
set "OutputFile=%USERPROFILE%\Desktop\str-unfixed.txt"

rem Define all search strings with omitted escape character.
set Search1=V^ape
set Search2=K^urium
set Search3=S^pook
set Search4=A^imassist
set Search5=T^riggerbot
set Search6=S^moothaim

rem Delete the output file from a previous run if existing at all.
del "%OutputFile%" 2>nul

for /F "delims=" %%I in ('%SystemRoot%\System32\findstr.exe /I /M /S /C:"%Search1%" /C:"%Search2%" /C:"%Search3%" /C:"%Search4%" /C:"%Search5%" /C:"%Search6%" *') do (
    echo %%I
    echo %%I>>"%OutputFile%"
)

if exist "%OutputFile%" (
    call :TypeWriter "Obligatory strings found."
    start "" "%OutputFile%"
) else (
    call :TypeWriter "No obligatory string found."
)
endlocal
goto :EOF

:TypeWriter
echo %~1

要了解使用的命令及其工作原理,请打开命令提示符 window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • call /?
  • del /?
  • echo /?
  • endlocal /?
  • findstr /?
  • for /?
  • goto /?
  • rem /?
  • set /?
  • setlocal /?
  • start /?

另请参阅 Microsoft 支持文章 Testing for a Specific Error Level in Batch Files and Microsoft TechNet article Using command redirection operators

只需通过对脚本名称的另一次检查来传递结果。

将您的第一行 findstr /i /s /m "Obligatory" *.* > str-unfixed.txt 替换为:

findstr/ism "Obligatory" *.*|findstr/ixvc:"%~nx0">str-unfixed.txt

但我要补充一点,我强烈建议不要搜索 C: 驱动器上的每个文件来寻找特定的搜索词。您确实确实需要以某种方式过滤它,也许可以通过更改文件 wildcard/mask.