【问题标题】:Remove lines from hosts file with batch if already exists如果已经存在,则使用批处理从主机文件中删除行
【发布时间】:2021-02-11 16:47:51
【问题描述】:

我有一个批处理脚本可以根据给定的 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地址。

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

【问题讨论】:

  • 我不会为此推荐cmd。这是可行的,但我会考虑使用 powershell。

标签: batch-file scripting hosts


【解决方案1】:
@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 的文件,其中包含一些用于我的测试的虚拟数据。

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

该过程将使用名为#* 的变量来临时存储相关文件中的“其他”行,因此首先清除可能存在的以# 开头的所有变量。

然后执行findstr 和“打印”行 NOT 包含(/V)作为/c:"string-to-EXclude" 和/N 提供的任何/L 文字字符串前导序列号,后跟冒号。

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    • 2018-04-27
    • 2012-09-02
    • 2013-12-18
    • 2016-04-18
    • 1970-01-01
    相关资源
    最近更新 更多