我有一个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)
我建议这个任务以下批处理文件的代码:
@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.exe
。 Sysnative
不针对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/