制作批处理文件以添加/删除特定行到主机文件

时间:2016-01-13 19:05:56

标签: batch-file hosts

我希望能够有一个2选项批处理文件,可以写入四行,也可以删除这些特定行而不擦除hosts文件中的其他行。我有一个脚本,我在这里找到: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

2 个答案:

答案 0 :(得分:1)

@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语句而不是断标签注释表单(:: comment),因为标签终止块,使cmd混淆。< / p>

这是一个完整的修订,因为我犯了解释原始批次正在做什么。

这意味着这将取代:ACCEPTED例程 - 您需要重新插入ipconfig命令

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

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

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

最后,move替换原始文件。

所有需要做的就是使用虚拟文件进行测试,经过验证后,将ipconfig...行添加到原始

最后,

答案 1 :(得分:0)

如果您打算写入或删除相同的四行,为什么不创建和维护两个文件(短版和长版)?然后根据你想做的事情复制相应的文件?

示例:

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,但您确实询问过批处理文件。