首页 > 解决方案 > 如果已经存在,则使用批处理从主机文件中删除行

问题描述

我有一个批处理脚本可以根据给定的 IP 地址添加新条目:

@echo off

SET NEWLINE=^& echo.

set /p ipAddress=What is the IPv4 address of the instance? 

FIND /C /I "storage.app.lab" %WINDIR%\system32\drivers\etc\hosts
IF %ERRORLEVEL% NEQ 0 ECHO %NEWLINE%^%ipAddress%    storage.app.lab>>%WINDIR%\System32\drivers\etc\hosts

FIND /C /I "home.app.lab" %WINDIR%\system32\drivers\etc\hosts
IF %ERRORLEVEL% NEQ 0 ECHO %NEWLINE%^%ipAddress%    home.app.lab>>%WINDIR%\System32\drivers\etc\hosts

FIND /C /I "api.app.lab" %WINDIR%\system32\drivers\etc\hosts
IF %ERRORLEVEL% NEQ 0 ECHO %NEWLINE%^%ipAddress%    api.app.lab>>%WINDIR%\System32\drivers\etc\hosts

pause

但是,如果输入了新的 IP 地址,我希望能够用域名覆盖现有条目。例如,如果已经存在域名为“storage.app.lab”的条目,则将其替换为新的IP地址。

如何在不使用备份主机文件的情况下实现这一目标?

标签: batch-filescriptinghosts

解决方案


@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "filename1=%sourcedir%\q64587777.txt"

:: I'll just use a fixed string for the IPaddress
set "IPaddress=User-input IP address"

:: remove variables starting #
FOR  /F "delims==" %%a In ('set # 2^>Nul') DO SET "%%a="

FOR /f "tokens=1*delims=:" %%a IN (
 'findstr /v /N /L /C:"storage.app.lab" /C:"home.app.lab" /C:"api.app.lab" "%filename1%"'
 ) DO set "#%%a=%%b"

(
FOR  /F "tokens=1*delims==" %%a In ('set # 2^>Nul') DO echo %%b
for %%a in ("storage.app.lab" "home.app.lab" "api.app.lab") do echo %IPaddress%   %%~a
)>"%filename1%"

GOTO :EOF

您需要更改设置sourcedir以适应您的情况。该清单使用适合我的系统的设置。

我使用了一个名为q64587777.txt包含一些虚拟数据的文件进行测试。

前几行简单地建立了用于测试的文件名变量,以及一个可识别的字符串来保存在测试中重新输入的数据。

该过程将使用为相关文件中“其他”行临时存储而命名#*的变量,因此首先清除可能存在的任何变量 start #

然后执行findstr并“打印”包含 ( /V)/L提供的任何文字字符串的行,/c:"string-to-EXclude"/N用前导序列号后跟冒号对这些行进行编号。

使用分隔符作为分隔符对行进行标记,并将行号分配给for /f( token 1) 并将行的其余部分(有问题的数据)分配给. 将环境变量设置为找到的行。:%%a%%b#%%a

然后在列表上使用相同的原则set #,它将列出#以 format开头的所有变量#1=line one,分隔=并选择第二个标记,这是最初从文件中读取的行数据。

并通过构造添加三个新行。

将两个for语句括起来会收集echoed 输出,然后将其重定向到原始文件,并覆盖它。

请注意,OP 的代码附加了(最多)三个新行。要求是(显然)这 3 行将出现在文件中,替换这三个条目的任何现有数据。


推荐阅读