为主机文件的 adding/removing 特定行创建一个批处理文件

Making a batch file for adding/removing specific lines to hosts file

我希望能够有一个 2 选项批处理文件,它可以写入四行并且还能够删除那些特定的行而不擦除主机文件中的其他行。我在这里找到了一个脚本:Windows Batch: How to add Host-Entries?,我为自己的用途编辑了它,但我对如何处理这个问题感到很困惑,因为我对编写批处理文件还很陌生。觉得你们可以帮助我吗?

@echo off

REM ...fluff removed...    

:ACCEPTED
setlocal enabledelayedexpansion
::Create your list of host domains
set LIST=(osu.ppy.sh a.ppy.sh c.ppy.sh c1.ppy.sh)
::Set the ip of the domains you set in the list above
set osu.ppy.sh=178.62.57.37
set a.ppy.sh=178.62.57.37
set c.ppy.sh=178.62.57.37
set c1.ppy.sh=178.62.57.37
:: deletes the parentheses from LIST
set _list=%LIST:~1,-1%
::ECHO %WINDIR%\System32\drivers\etc\hosts > tmp.txt
for  %%G in (%_list%) do (
    set  _name=%%G
    set  _value=!%%G!
    SET NEWLINE=^& echo.
    ECHO Carrying out requested modifications to your HOSTS file
    ::strip out this specific line and store in tmp file
    type %WINDIR%\System32\drivers\etc\hosts | findstr /v !_name! > tmp.txt
    ::re-add the line to it
    ECHO %NEWLINE%^!_value! !_name!>>tmp.txt
    ::overwrite host file
    copy /b/v/y tmp.txt %WINDIR%\System32\drivers\etc\hosts
    del tmp.txt
)
ipconfig /flushdns
ECHO.
ECHO.
ECHO Finished, you may close this window now.
GOTO END

:END
EXIT

如果您打算编写或删除相同的四行,为什么不创建和维护两个文件(短版和长版)?然后根据自己的需要复制对应的文件?

示例:

pushd %systemroot%\system32\drivers\etc
choice /C:SL "Choose S for short or L for long."
IF errorlevel 2 goto long
IF errorlevel 1 goto short

:long
copy hosts.long hosts
goto end

:short
copy hosts.short hosts
goto end

:end
popd

就个人而言,我会使用 PowerShell,但您确实询问了有关批处理文件的问题。

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

:ACCEPTED
setlocal enabledelayedexpansion
SET "filename1=%WINDIR%\System32\drivers\etc\hosts"
SET "filename1=q34775003.txt"
::Create your list of host domains
set LIST=(osu.ppy.sh a.ppy.sh c.ppy.sh c1.ppy.sh)
::Set the ip of the domains you set in the list above
set osu.ppy.sh=178.62.57.37
set a.ppy.sh=178.62.57.37
set c.ppy.sh=178.62.57.37
set c1.ppy.sh=178.62.57.37

ECHO Carrying out requested modifications to your HOSTS file
:: remove existing names from hosts file

findstr /v /e "%LIST:~1,-1%" "%filename1%"> tmp.txt

:: Add new list
for  %%G in %list% do (
rem    set  _name=%%G
rem    set  _value=!%%G!
    ECHO !%%G! %%G>>tmp.txt
)
::overwrite host file
move tmp.txt %filename1% >nul
)

在块语句 (a parenthesised series of statements) 中,应使用 REM 语句而不是 broken-label 注释形式 (:: comment),因为标签终止块,混淆 cmd.

这是一个完整的修订版,因为我弄错了对原始批处理的解释。

旨在取代 :ACCEPTED 例程 - 您需要 re-insert ipconfig 命令

filename1设置为真实文件位置,然后设置为测试文件位置进行测试。您需要删除多余的设置。

首先,删除现有的名称条目并temp.txt 使用其余部分创建。要匹配(并因此被删除)名称必须在行尾匹配,因此 a.ppy.sh 将被删除,但 a.ppy.shx 将被保留。

接下来,新条目将附加到 temp.txt

最后,move替换了原来的文件。

所有需要做的就是用一个虚拟文件进行测试,当得到证实时,像原来的那样附加 ipconfig...

最后,