Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Добавить строку в конце текстовых файлов (http://forum.oszone.net/showthread.php?t=187587)

Seryoga204 06-10-2010 14:30 1512749

Добавить строку в конце текстовых файлов
 
Подскажите пожалуйста как при помощи батника, добавить одну строку с определенным текстом в конце каждого текстового файла в папке?

Petya V4sechkin 06-10-2010 14:37 1512755

Seryoga204, примерно так?
Код:

@Echo Off
SetLocal EnableExtensions

For %%I In (*.txt) Do Echo ваш текст>>"%%I"


sov44 14-11-2010 13:34 1542406

Подскажите, как сделать проверку наличия текста в файле, в случае его отсутствия дописать строчки, в случае наличия текста в файле, ничего не предпринимать.
Код:

@Echo Off
SetLocal EnableExtensions
For %%I In (%windir%\system32\drivers\etc\hosts) Do Echo 127.0.0.1  ХХХ.com >>"%%I"
For %%I In (%windir%\system32\drivers\etc\hosts) Do Echo 127.0.0.1  www.ХХХ.com >>"%%I"


El Sanchez 14-11-2010 14:51 1542462

sov44,
Код:

Find /I "text" "C:\test.txt" 1>nul||Echo text>>"C:\test.txt"

Iska 14-11-2010 14:59 1542465

El Sanchez, мне кажется, тут есть подводный камень: добавляемая строка теоретически может уже присутствовать в виде подстроки в файле. Я бы сделал полный разбор (благо структура проста донельзя), например:
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sHostFile=%SystemRoot%\System32\drivers\etc\hosts
set sHost=%~1


if defined sHost (
    for /f "usebackq eol=# tokens=1,2" %%i in ("%sHostFile%") do (
        if /i "%%j" equ "%sHost%" (
            set /a bFound = 1
            set sAddress=%%i
        )
    )
   
    if defined bFound (
        echo.Host [%sHost%] ^(!sAddress!^) already present in [%sHostFile%]
    ) else (
        echo.Add host [%sHost%] ^(127.0.0.1^) into [%sHostFile%]
        echo.127.0.0.1    %sHost%>>"%sHostFile%"
    )
) else (
    echo.Usage: "%~nx0" ^<hostname^>
)

endlocal
exit /b 0

Примеры вызовов:
Код:

Add2Hosts.cmd www.xxx.com
Add2Hosts.cmd xxx.com


sov44 14-11-2010 20:06 1542633

Iska, пример El Sanchez я понял, а ваш с сожалению нет, как и не понял примеры вызовов. ( я не профи :) ) Расскажите, что и как.

Iska 15-11-2010 13:21 1543094

Описание:
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

# Переменная для пути к файлу
set sHostFile=%SystemRoot%\System32\drivers\etc\hosts

# Переменная, в которую помещается первый аргумент пакетного файла
set sHost=%~1

# Если определена переменная sHost (а это произойдёт только в том случае,
# если аргумент был указан при вызове пакетного файла), то начинаем работу…
if defined sHost (
        # …читаем построчно из файла hosts, пропуская комментарии;
        # первая подстрока будет IP-адрес, вторая — dns-имя
    for /f "usebackq eol=# tokens=1,2" %%i in ("%sHostFile%") do (
        # Если вторая подстрока будет равна указанному аргументу пакетного файла…
        if /i "%%j" equ "%sHost%" (
            # …задаём переменную bFound для запоминания этого факта
            # (в принципе, здесь уже можно осуществлять выход из цикла чтения,
            # ибо дальнейшая проверка не нужна — я просто не стал усложнять)
            set /a bFound = 1
            # Исключительно для информационных целей запоминаем и IP-адрес хоста
            set sAddress=%%i
        )
    )
   
    # После того как все строки файла hosts будут прочитаны, проверяем существование
    # переменной bFound — если она существует…
    if defined bFound (
        # …значит такой хост уже есть в файле hosts; выводим информацию об сём факте
        echo.Host [%sHost%] ^(!sAddress!^) already present in [%sHostFile%]
    ) else (
        # Иначе опять же уведомляем о добавлении…
        echo.Add host [%sHost%] ^(127.0.0.1^) into [%sHostFile%]
        # …и производим само добавление хоста в файл hosts
        echo.127.0.0.1    %sHost%>>"%sHostFile%"
    )
# …если при вызове пакетного файла аргумент не был указан,
# попадаем именно сюда и выводим информацию об использовании пакетного файла
) else (
    echo.Usage: "%~nx0" ^<hostname^>
)

endlocal
exit /b 0

Цитата:

Цитата sov44
не понял примеры вызовов »

Пакетный файл может быть назван, например, «Add2Hosts.cmd». Вызывать его нужно с указанием dns-имени добавляемого хоста.

sov44 17-11-2010 20:20 1545150

Iska, благодарю за исчерпывающий мануал. Добавил одну строчку, прописав
Код:

set sHost=xxx.com
Как поправить скрипт, чтобы записать вторую строчку типа
Код:

www.xxx.com
?

Iska 18-11-2010 03:07 1545376

Цитата:

Цитата sov44
Добавил одну строчку, прописав…»

Это в принципе неправильно, верните как было.
Цитата:

Цитата sov44
Как поправить скрипт, чтобы записать вторую строчку типа »

Создаёте ещё один пакетный файл, в котором дважды делаете вызов пакетного файла #5:
Код:

call Add2Hosts.cmd xxx.com
call Add2Hosts.cmd www.xxx.com

Нужно будет добавить пять хостов — соответственно, делаете пять вызовов пакетного файла, указывая аргументом нужный хост.

sov44 18-11-2010 07:14 1545415

Цитата:

Цитата Iska
Нужно будет добавить пять хостов — соответственно, делаете пять вызовов »

Нужно, чтобы оба хоста прописывались внутри через один командный файл.

El Sanchez 18-11-2010 08:43 1545442

Цитата:

Цитата sov44
Нужно, чтобы оба хоста прописывались через один командный файл. Вызов одного батника из под другого не удобен »

sov44, тогда отредактируйте вариант Iska так:
Код:

@echo off
set sHostFile=%SystemRoot%\System32\drivers\etc\hosts
for %%a in (%*) do (
    setlocal enableextensions enabledelayedexpansion
    set sHost=%%a

    if defined sHost (
        for /f "usebackq eol=# tokens=1,2" %%i in ("%sHostFile%") do (
            if /i "%%j" equ "!sHost!" (
                set /a bFound = 1
                set sAddress=%%i
            )
        )
   
        if defined bFound (
            echo.Host [!sHost!] ^(!sAddress!^) already present in [%sHostFile%]
        ) else (
            echo.Add host [!sHost!] ^(127.0.0.1^) into [%sHostFile%]
            echo.127.0.0.1    !sHost!>>"%sHostFile%"
        )
    ) else (
        echo.Usage: "%~nx0" ^<hostname^>
    )

    endlocal
)
exit /b 0

Хосты пишете через пробел, например:
Код:

Add2Hosts.cmd www.xxx.com yyy.net www.zzz.info

sov44 18-11-2010 10:11 1545487

El Sanchez, Нужен батник, в нутри которого надо прописать два хоста.

amel27 18-11-2010 10:57 1545523

Код:

@echo off

call:Add2Hosts xxx.com
call:Add2Hosts www.xxx.com

EXIT

:Add2Hosts
:: сюда
:: перенести
:: код батника
:: от setlocal
:: до endlocal

GoTo:EOF


sov44 18-11-2010 12:48 1545600

amel27, отлично, то что надо! Спасибо!

Iska 19-11-2010 02:33 1546096

Из письма:
Цитата:

Цитата sov44
Только что переустановил WinXP (виртуальная система) и применил Ваш твик. Небольшой баг. Первый хост прописался в одной строке с предыдущим, второй в новой строки.

Такое произойдёт, если последняя строка текстового файла hosts не заканчивается «CrLf», соответственно, первое «echo bla-bla-bla>>"…\hosts"» будет писать не с новой строки, а в конец последней. Я не проверял, как обстоит сие с файлом «%SystemRoot%\system32\drivers\etc\hosts» в свежеустановленной ОС, но, скорее всего, именно так. Выйти из положения можно, например, добавив:
Код:

echo.>>"%sHostFile%"
сразу после
Код:

set sHostFile=%SystemRoot%\System32\drivers\etc\hosts
в варианте от El Sanchez; в варианте же от amel27 можно перенести строку с заданием переменной окружения «sHostFile» в основную часть пакетного файла из процедуры и добавить вышеуказанную строку.


Время: 15:29.

Время: 15:29.
© OSzone.net 2001-