Войти

Показать полную графическую версию : [решено] Добавить строку в конце текстовых файлов


Seryoga204
06-10-2010, 14:30
Подскажите пожалуйста как при помощи батника, добавить одну строку с определенным текстом в конце каждого текстового файла в папке?

Petya V4sechkin
06-10-2010, 14:37
Seryoga204, примерно так?
@Echo Off
SetLocal EnableExtensions

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

sov44
14-11-2010, 13:34
Подскажите, как сделать проверку наличия текста в файле, в случае его отсутствия дописать строчки, в случае наличия текста в файле, ничего не предпринимать.
@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
sov44,

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

Iska
14-11-2010, 14:59
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
Iska, пример El Sanchez я понял, а ваш с сожалению нет, как и не понял примеры вызовов. ( я не профи :) ) Расскажите, что и как.

Iska
15-11-2010, 13:21
Описание:
@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
не понял примеры вызовов »
Пакетный файл может быть назван, например, «Add2Hosts.cmd». Вызывать его нужно с указанием dns-имени добавляемого хоста.

sov44
17-11-2010, 20:20
Iska, благодарю за исчерпывающий мануал. Добавил одну строчку, прописав set sHost=xxx.com Как поправить скрипт, чтобы записать вторую строчку типа www.xxx.com ?

Iska
18-11-2010, 03:07
Добавил одну строчку, прописав…»
Это в принципе неправильно, верните как было.
Как поправить скрипт, чтобы записать вторую строчку типа »
Создаёте ещё один пакетный файл, в котором дважды делаете вызов пакетного файла #5 (http://forum.oszone.net/post-1542465-5.html):
call Add2Hosts.cmd xxx.com
call Add2Hosts.cmd www.xxx.com
Нужно будет добавить пять хостов — соответственно, делаете пять вызовов пакетного файла, указывая аргументом нужный хост.

sov44
18-11-2010, 07:14
Нужно будет добавить пять хостов — соответственно, делаете пять вызовов »
Нужно, чтобы оба хоста прописывались внутри через один командный файл.

El Sanchez
18-11-2010, 08:43
Нужно, чтобы оба хоста прописывались через один командный файл. Вызов одного батника из под другого не удобен »
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
El Sanchez, Нужен батник, в нутри которого надо прописать два хоста.

amel27
18-11-2010, 10:57
@echo off

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

EXIT

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

sov44
18-11-2010, 12:48
amel27, отлично, то что надо! Спасибо!

Iska
19-11-2010, 02:33
Из письма:Только что переустановил WinXP (виртуальная система) и применил Ваш твик. Небольшой баг. Первый хост прописался в одной строке с предыдущим, второй в новой строки.
Такое произойдёт, если последняя строка текстового файла hosts не заканчивается «CrLf», соответственно, первое «echo bla-bla-bla>>"…\hosts"» будет писать не с новой строки, а в конец последней. Я не проверял, как обстоит сие с файлом «%SystemRoot%\system32\drivers\etc\hosts» в свежеустановленной ОС, но, скорее всего, именно так. Выйти из положения можно, например, добавив:
echo.>>"%sHostFile%"
сразу после
set sHostFile=%SystemRoot%\System32\drivers\etc\hosts
в варианте от El Sanchez (http://forum.oszone.net/post-1545442-11.html); в варианте же от amel27 (http://forum.oszone.net/post-1545523-13.html) можно перенести строку с заданием переменной окружения «sHostFile» в основную часть пакетного файла из процедуры и добавить вышеуказанную строку.




© OSzone.net 2001-2012