找到一个单词并用批处理文件替换一行

时间:2013-12-02 22:41:10

标签: windows shell batch-file cmd hosts

我的Windows XP Virtual Box上有一台本地服务器。

每次我的主网络从wifi变为有线或我移动到不同的网络时,我的Win XP盒的IP都会发生变化。

我想运行一个批处理文件,将新IP映射到我的主机文件中的某个通用名称

C:\WINDOWS\system32\drivers\etc\hosts

例如,如果我现在有:

10.97.100.74 www.myAppServer.com

如果ip更改为192.168.11.9, 我想在hosts文件中搜索字符串myAppServer,并用

替换整行

192.168.11.9 www.myAppServer.com

我能够使用以下方式获取当前的IP:

for /f "skip=1 delims={}, " %%A in ('wmic nicconfig get ipaddress') do for /f "tokens=1" %%B in ("%%~A") do set "IP=%%~B"

set IP=%IP%

但如何找到该行并替换它?

4 个答案:

答案 0 :(得分:0)

我在DOS Tips

上找到了这个

BatchSubstitute - 逐行解析文件并替换子字符串

@echo off
REM -- Prepare the Command Processor --
SETLOCAL ENABLEEXTENSIONS
SETLOCAL DISABLEDELAYEDEXPANSION

::BatchSubstitute - parses a File line by line and replaces a substring
::syntax: BatchSubstitute.bat OldStr NewStr File
::          OldStr [in] - string to be replaced
::          NewStr [in] - string to replace with
::          File   [in] - file to be parsed
::$changed 20100115
::$source http://www.dostips.com
if "%~1"=="" findstr "^::" "%~f0"&GOTO:EOF
for /f "tokens=1,* delims=]" %%A in ('"type %3|find /n /v """') do (
    set "line=%%B"
    if defined line (
        call set "line=echo.%%line:%~1=%~2%%"
        for /f "delims=" %%X in ('"echo."%%line%%""') do %%~X
    ) ELSE echo.
)

答案 1 :(得分:0)

如果你想替换只有一行,你可以这样做:

@echo off
setlocal

cd "C:\WINDOWS\system32\drivers\etc"
for /F "delims=:" %%a in ('findstr /N "myAppServer" hosts') do set lineNum=%%a
(for /F "tokens=1* delims=:" %%a in ('findstr /N "^" hosts') do (
   if %%a equ %lineNum% (
      echo 192.168.11.9 www.myAppServer.com
   ) else (
      echo %%a
   )
)) > hosts.new

此程序消除空行,如果hosts文件包含批处理特殊字符(如| > < & !),则会出现问题。如果需要,可以修复这些细节。

答案 2 :(得分:0)

最简单的方法就是不替换它。删除它并添加一个新行。

如果您的IP地址为%IP%,则

set "hostsFile=%systemroot%\system32\drivers\etc\hosts"
(
    findstr /v /i /c:"www.MyAppServer.com" "%hostsFile%"
    echo(
    echo %IP% www.MyAppServer.com
) > "%temp%\hosts"

move /y "%temp%\hosts" "%hostsFile%" >nul 2>nul

并确保您拥有足以更改hosts文件的权限,并且没有防病毒软件阻止对其进行更改。

答案 3 :(得分:0)

这终于完成了工作:

@echo off
REM Set a variable for the Windows hosts file location
set "hostpath=%systemroot%\system32\drivers\etc"
REM set "hostpath=C:\projectStar\Programs\etc" 
set "hostfile=hosts"

REM Make the hosts file writable
attrib -r -s -h "%hostpath%\%hostfile%"

for /f "skip=1 delims={}, " %%A in ('wmic nicconfig get ipaddress') do for /f "tokens=1" %%B in ("%%~A") do set "IP=%%~B"
REM echo %IP%
set IP=%IP%

move /y "%hostpath%\%hostfile%" "Hs.txt"
findstr /v/c:"www.nexsoftnetwork.com" Hs.txt > "Hss2.txt"
echo %IP%   www.nexsoftnetwork.com >>"Hss2.txt"

move /y "Hss2.txt" "%hostpath%\%hostfile%"

echo Done.
pause

谢谢大家的投入。 但我想从我的手机上打这个服务器,这个服务器与服务器在同一个网络上。最后我注意到,除非我修改主机操作系统或手机的主机文件,否则它仍然无法解决我的问题。只有当我想在虚拟框中点击此服务器时,此解决方案才有效。