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

问题描述 投票:2回答:1

我有一个IP,并在etc / hosts文件中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)
  • 可以忽略注释掉线
  • 可以搜索不区分大小写
  • 会写一个字符串,如果没有找到字符串
windows batch-file
1个回答
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位cmd.exe 32位Windows执行或由在目录cmd.exe 64位%SystemRoot%\System32 64位的Windows。

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

如果文件存在hosts在所有的下一步检查。如果该文件不存在,则数据线要追加可直接写入文件而没有任何进一步的检查,由此在这种情况下,所创建的文件hosts

否则,该命令FINDSTR用于搜索不区分大小写有用于与重定向也许发现线(S),以设备NUL mystring一个字面解释搜索字符串。 FINDSTR与价值0退出,如果有至少一个正匹配,并与值1如果搜索字符串不能在任何行中找到。

if not errorlevel 1意味着如果退出代码是比1大于或等于1,或者换句话说LOWER,或在这种情况下,因为FINDSTR的EQUAL 0从不具有负的值作为几乎所有应用和命令退出。所以,如果这个条件为真,该文件包含hosts至少一次搜索的字符串并没有什么改变的文件。

否则FINDSTR被再次使用与线路的末端和输出没有,因为选项/V的结束的行所有行正则表达式搜索这个时候。因此,如果在文件hosts最后一行没有行结束,FINDSTR与价值0退出,因为其结尾由此该输出重定向到设备NUL没有线路输出一行。

甲行结束被附加到文件hosts如果FINDSTR退出,值0因为文件的hosts与附加下一个数据线添加到该文件之前结束无线结束。

上面的代码,如果不与本地管理员或hosts具有只读属性设置或通过脚本对修改,否则保护的文件的提升权限执行的批处理文件无法正常工作。

BTW:IPv4地址的八位不能大于255所以111.222.333.444是IPv4地址添加到文件,因为是一个无效的IPv4地址hosts一个可怕的例子。

对于理解使用的命令以及它们如何工作,打开命令提示符窗口中,执行有下面的命令,并阅读完全针对每个命令非常仔细地显示所有帮助页面。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.