batch-file - 如果已经存在,则使用批处理从主机文件中删除行
问题描述
我有一个批处理脚本可以根据给定的 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地址。
如何在不使用备份主机文件的情况下实现这一目标?
解决方案
@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
语句括起来会收集echo
ed 输出,然后将其重定向到原始文件,并覆盖它。
请注意,OP 的代码附加了(最多)三个新行。要求是(显然)这 3 行将出现在文件中,替换这三个条目的任何现有数据。
推荐阅读
- swift - 将 unicodeScalars 索引转换为 swift 字符串中的字符索引
- vuejs2 - 使用 VueJs 在浏览器中不显示引导进度条
- javascript - 是否可以让我的 discord.js 机器人忽略某些用户?更像是通过命令将它们添加到 json 文件中并忽略所有这些
- node.js - 连接到另一个 Node API 时,Azure Web Apps 中的 React App 得到 404
- java - 使用 ImageIcon 函数时如何修复“图标无法解析为类型”错误
- php - 如何使用 ajax 和 php 发布数据数组
- ios - 评论主故事板上的观点
- android - 意图返回活动后Android列表消失
- python - 该模块不知道它在 Python 中的已知包
- c# - 如何使用 ASP.NET MVC 在控制器函数中将选中的复选框作为参数传递