批处理文件检查其他文件中的字符串

时间:2018-12-27 18:20:14

标签: windows batch-file

我有一个批处理文件,该文件在etc / hosts文件中写了一个带ip的行和ip的名称。有没有办法检查此行是否已经存在?或者只是看看文件中是否存在单词?

编辑: 想要类似字符串是否存在但不回显的东西

初始代码

findstr "mystring" "C:\Windows\System32\drivers\etc\hosts" >nul 2>&1
if errorlevel 1 echo 111.222.333.444 mystring>>%systemroot%\SYSTEM32\DRIVERS\ETC\HOSTS

已解决:具有建议的增强功能

    findstr /V "^#" "C:\Windows\System32\drivers\etc\hosts" | findstr /ILC:"mystring" >nul 2>&1 ||^
(echo 111.222.333.444 mystring>>%systemroot%\SYSTEM32\DRIVERS\ETC\HOSTS)
  • 可以忽略注释掉的行
  • 可以搜索不区分大小写的字符串
  • 如果找不到字符串,将写一个字符串

1 个答案:

答案 0 :(得分:0)

对于此任务,我建议使用以下批处理文件代码:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "HostsFile=%SystemRoot%\System32\drivers\etc\hosts"
if not "%ProgramFiles(x86)%" == "" if exist %SystemRoot%\Sysnative\cmd.exe set "HostsFile=%SystemRoot%\Sysnative\drivers\etc\hosts"
if not exist %HostsFile% goto AppendData
%SystemRoot%\System32\findstr.exe /I /L /C:"mystring" %HostsFile% >nul
if not errorlevel 1 goto EndBatch
%SystemRoot%\System32\findstr.exe /R /V "$" %HostsFile% >nul
if not errorlevel 1 echo/>>%HostsFile%
:AppendData
>>%HostsFile% echo 111.222.33.44    mystring
:EndBatch
endlocal

第三行用标准文件路径定义环境变量HostsFile,该变量正好在32位Windows由32位cmd.exe执行的批处理文件或64位Windows由64位执行的批处理文件中目录cmd.exe中的%SystemRoot%\System32位。

第四行根据Windows File System Redirector考虑​​了WOW64 Implementation Details。如果定义了名称为ProgramFiles(x86)且具有非空值的环境变量,则该批处理文件将在64位Windows上执行。但是,如果存在cmd.exe,则批处理文件由目录%SystemRoot%\SysWOW64中的32位%SystemRoot%\Sysnative\cmd.exe执行。重定向器Sysnative对于x64应用程序不存在。在这种情况下,必须在文件路径中使用hosts重定向器,才能从64位Windows的32位环境中引用文件Sysnative

接下来检查文件hosts是否存在。如果该文件不存在,则可以在不进行任何进一步检查的情况下将要追加的数据行直接写入该文件,从而可以在这种情况下创建文件hosts

否则,命令 FINDSTR 用于搜索不区分大小写的mystring字面意义的搜索字符串,并将可能找到的行重定向到设备 NUL 。如果存在至少一个正匹配项,则 FINDSTR 以值0退出,如果在任何行上都找不到搜索字符串,则以值1退出。

if not errorlevel 1表示 IF 退出代码为 NOT GREATER或EQUAL 1 ,即低于1 ,或在这种情况下,由于 FINDSTR 而导致等于0 的情况下,几乎所有应用程序和命令都不会以负值退出。因此,如果此条件为真,则文件hosts至少包含一次搜索到的字符串,并且文件上没有任何更改。

否则,再次使用 FINDSTR 来搜索带有正则表达式的行尾,并输出所有由于选项{{ 1}}。因此,如果文件/V中的最后一行没有行尾,则 FINDSTR 以值hosts退出,因为输出了一行无行尾,因此该输出重定向到设备< strong> NUL

如果由于文件0而退出 FINDSTR 并返回值hosts,则行结尾将附加到文件0,而在附加下一个数据之前,行末没有结尾添加到此文件的行。

如果未在本地管理员提升权限的情况下执行批处理文件,或者文件hosts设置了只读属性,或者受脚本保护,则该代码无法正常工作。

BTW:IPv4地址的八位字节不能大于255。因此,hosts是添加到文件111.222.333.444的IPv4地址的一个糟糕示例,因为它是无效的IPv4地址。

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。

  • hosts
  • echo /?
  • endlocal /?
  • findstr /?
  • goto /?
  • if /?
  • set /?

另请参阅DosTips论坛主题:ECHO. FAILS to give text or blank line - Instead use ECHO/