Компьютерный форум 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=232084)

Raf-9600 05-04-2012 00:24 1893689

Добавление текста
 
Собстно мне необходимо добавить пару слов в txt файл, но без использования GUI. Т.е. условно "через батник". Такое возможно?

Нужно чтобы:
1. Текст добавлялся в первую свободную строку (т.е. НЕ с новой строчки).
2. Чтобы скрипт срабатывал, даже если текста в файле изначально нет (он может быть, а может и не быть).
3. Не удалял уже существующий текст в файле (если в нем есть текст)
4. Чтобы если файла не существует, скрипт его создавал (это не критично)

Morpheus 05-04-2012 00:39 1893698

CMD/BAT - [решено] Дописать в конец файла

Raf-9600 05-04-2012 00:50 1893704

А можно вариант, в котором текст записывался бы не с новой строчки, а просто в конец уже существующей?

Morpheus 05-04-2012 00:58 1893707

CMD/BAT - [решено] как дописать текст в текстовой файл

Raf-9600 05-04-2012 01:04 1893710



P.S.
Сорри что сам забыл о возможности поиска по форуму :)

Raf-9600 09-04-2012 14:52 1896283

Цитата:

Цитата Morpheus
CMD/BAT - [решено] как дописать текст в текстовой файл »

Протестировал тамтешние скрипты более детально и заметил одну неприятную особенность: они срабатывают, только если в txt файле уже есть текст, а мне нужно чтобы текст добавлялся независимо от этого.
В идеале вообще хотелось бы, чтобы если файл не найден, то батник его создавал...

Iska 09-04-2012 15:31 1896321

Raf-9600, и что мешает сие сделать самостоятельно?

Код:

if exist "file.txt" (
    …
) else (
    …
)


Oleg48 09-04-2012 15:34 1896324

Попробуй
Код:

ECHO %DATE%.%TIME%.%1 обновлен успешно >> otchet.txt
Добавляю, запись с датой, временем и результатом выполнения скрипта в файл отчета, если файл не существует то создается новый, а если существует дописывается в конец файла. Вся хитрость в использовании "ECHO" с ">>", если оставить одну ">"то эта команда просто полностью перепишет уже существующий файл или создаст новый файл с текстом, однако ">>" дописывает текст в конец файла и может создавать новый файл с текстом если такого файла нет.

Raf-9600 09-04-2012 15:40 1896329

Oleg48, для меня критично чтобы текст записывался не с новой строки, а с последней.

Oleg48 09-04-2012 15:50 1896337

В смысле, дописывался в конец последней строки?
А что на
Цитата:

Цитата Morpheus
CMD/BAT - [решено] как дописать текст в текстовой файл »

примеры неработают, там вроде все просто. Может нужно переписать последнюю строку в текстовом файле?

Raf-9600 09-04-2012 15:52 1896339

Цитата:

Цитата Oleg48
примеры неработают, там вроде все просто. »

Они срабатывают, только если в файле изначально есть хоть какой-то текст.

Raf-9600 09-04-2012 16:48 1896394

Хм... Я придумал, как обойти проблему. Можно создать файл с одним символом, допустим с "-", потом воспользоваться скриптами из темы
Цитата:

Цитата Morpheus
CMD/BAT - [решено] как дописать текст в текстовой файл »

а потом удалить этот "-". Собсно вопрос: как из блокнота удалить один конкретный символ?

Iska 09-04-2012 17:49 1896455

Raf-9600, создавайте пустой файл:
Код:

>nul copy nul file.txt

Raf-9600 09-04-2012 18:06 1896465

Цитата:

Цитата Iska
создавайте пустой файл: »

Создание пустого файла, это не настолько важна проблема как:
1. Добавление текста в первую строчку файла, вне зависимости от того пустой он или нет. (Т.е. НЕ с новой строки)
2. Удаление одного конкретного символа из файла.
Если бы одну из этих проблем решить, было бы очень круто (^_^)

Oleg48 09-04-2012 18:15 1896471

Raf-9600, сделал через "точку"
Код:

@Echo Off 
set fail=123.txt 
set tekct=Этот текст надо дописать 
IF NOT exist %fail% (echo .>%fail%) 
For /F "tokens=*" %%i In (%fail%) Do Set ti=%%i 
Set new=%ti:.=% 
Set new=%new%%tekct% 
Echo %new%>123.txt


Iska 09-04-2012 19:17 1896498

Raf-9600, для удовлетворения подобных требований пакетные файлы без использования сторонних утилит не слишком годятся. Рассмотрите вопрос о переходе к WSH/PoSH.

2Oleg48:
1. Зачем Вы добавляете в конец почти каждой строки пакетного файла по два пробела?
2. Проверьте, например, Ваш код на таком файле:
Код:

He.ll.o Wo.r.ld!
He.ll.o Wo.r.ld!

и посмотрите, во что он превратится.

Raf-9600 09-04-2012 19:26 1896506

Цитата:

Цитата Oleg48
сделал через "точку" »

То, что нужно! Благодарю.

Цитата:

Цитата Iska
для удовлетворения подобных требований пакетные файлы без использования сторонних утилит не слишком годятся. Рассмотрите вопрос о переходе к WSH/PoSH. »

Честно говоря, я это и предполагал, поэтому создал эту тему в другом разделе, но модераторам показалось, что батники меня спасут, и они перенесли её сюда :)

Iska 09-04-2012 20:57 1896570

Цитата:

Цитата Raf-9600
поэтому создал эту тему в другом разделе, но модераторам показалось, что батники меня спасут, и они перенесли её сюда »

Спасибо, ясно. Возможно, потому, что изначально не все требования ТЗ были озвучены.

Morpheus 09-04-2012 22:33 1896646

Можно и без точек.
Код:

@Echo Off
set file=D:\123.txt
set text=text

For /F "tokens=*" %%i In (%file%) Do Set ti=%%i%text%
if "%ti%"=="" (
echo %text%>%file%
) else (
echo %ti%>%file%
)
pause


Iska 09-04-2012 23:00 1896660

Morpheus, то же — в файле остаётся одна строка.

Morpheus 09-04-2012 23:24 1896676

Iska, ну да, но вроде на это жалоб не было?

Raf-9600 09-04-2012 23:29 1896680

Morpheus, были ;)
Ваш скрипт удаляет текст, который был в файле до применения батника, это неприемлемо.

Morpheus 09-04-2012 23:40 1896687

Raf-9600, однако про скрипт в сообщении 15 вы написали
Цитата:

Цитата Raf-9600
То, что нужно! Благодарю. »


Raf-9600 09-04-2012 23:42 1896689

Morpheus, а вы его проверьте ;)
Он не удаляет текст, который уже есть в файле, он дописывает к нему новый.

Morpheus 09-04-2012 23:44 1896691

Raf-9600, да ну?
Создайте файл с текстом
Код:

aaa
bbb
ccc

и натравите скрипт, получите
Код:

cccЭтот текст надо дописать
А в случае если файл пустой, получите
Код:

.=Этот текст надо дописать

Iska 09-04-2012 23:50 1896694

Цитата:

Цитата Morpheus
и натравите скрипт, получите »

Morpheus, я это и имел в виду, говоря выше «то же».

Raf-9600, может, всё-таки, откажемся от пакетного файла?

Morpheus 09-04-2012 23:53 1896699

Iska, может есть возможность прочитать его целиком, а не построчно? Неужели для такой простой операции надо в другие языки уходить?

Raf-9600 09-04-2012 23:59 1896703

Цитата:

Цитата Morpheus
да ну? »

На самом деле тот скрипт забагирован. Благодарю что обратили мое внимание на это.

Цитата:

Цитата Iska
может, всё-таки, откажемся от пакетного файла? »

Мне не критичен способ реализации.

Цитата:

Цитата Morpheus
для такой простой операции »

Снимаю галочку "решено" из названия темы, и смиренно надеюсь, что кто-нибудь поможет в решении этой задачки

P.S.
Обновил первый пост.

Iska 10-04-2012 00:14 1896709

Цитата:

Цитата Raf-9600
1. Текст добавлялся в первую свободную строку (т.е. НЕ с новой строчки). »

Это как?

В конец последней строки, независимо от того, заканчивается ли она символами «Конец строки»:
Код:

Hello·World¶
Hello·World¶
Hello·World¶

либо она не заканчивается символами «Конец строки»:
Код:

Hello·World¶
Hello·World¶
Hello·World

так?

И куда добавлять, если, например, в конце файла несколько пустых строк:
Код:

Hello·World¶
Hello·World¶
Hello·World¶



Foreigner 10-04-2012 00:19 1896714

Raf-9600, на POSH
Код:

$text = "Текст"

if (!(test-path 1.txt)) { new-item -t file 1.txt }

$content = @()
$content += get-content 1.txt
$content[0] += $text

$content | set-content 1.txt


Raf-9600 10-04-2012 00:19 1896716

Iska, у меня вообще планируется только одна строка :)
Наверное, в конец первой строки...

Oleg48 10-04-2012 00:23 1896720

Цитата:

Цитата Morpheus
А в случае если файл пустой, получите
Код:
.=Этот текст надо дописать »

Morpheus, это неправда проверте еще раз, перед тем как запускать удалите сушествующий пустой файл, тогда все будет работать.

Цитата:

Цитата Morpheus
и натравите скрипт, получите
Код:
cccЭтот текст надо дописать »

Согласен, вывод такой, однако за основу я брал код сдесь CMD/BAT - [решено] Дописать в конец файла, значит там закралась ошибка, сори (извиняюсь) непроверил чужой код. В нем и правда каждое значение предыдущей строчки затирается следующей, подумаю еще.

Raf-9600 10-04-2012 00:24 1896722

Цитата:

Цитата Foreigner
на POSH »

Эм... Загуглил что это такое... В общем, желательно бы чтобы способ был работоспособен на любой версии Windows (в том числе на 9x), а POSH это если не обманывает Википедия, только для новых.

P.S.
Извините, что не сказал об этом ранее.

Цитата:

Цитата Oleg48
это неправда проверте еще раз, перед тем как запускать удалите сушествующий пустой файл, тогда все будет работать. »

Дважды запустите этот скрипт:

Код:

@Echo Off 
set fail=Command.txt
set tekct=;multitest
IF NOT exist %fail% (echo .>%fail%)
For /F "tokens=*" %%i In (%fail%) Do Set ti=%%i
Set new=%ti:.=%
Set new=%new%%tekct%
Echo %new%>Command.txt


Morpheus 10-04-2012 00:27 1896724

Цитата:

Цитата Oleg48
это неправда проверте еще раз, перед тем как запускать удалите сушествующий пустой файл, тогда все будет работать. »

Если файл пустой, о чём я и сказал, то это правда. Есть 3 состояния:
1. Файл с текстом
2. Файл пустой
3. Файла нет

Единственное отличие 19 от 15 как раз в корректной обработке пустых файлов.

Oleg48 10-04-2012 00:29 1896728

Morpheus, у меня два
1) файла нет
2) файл непустой однострочный
Таким его сделал ну а дальше надо переделывать

Raf-9600 10-04-2012 00:30 1896730

Morpheus, на самом деле Oleg48 по-своему прав. Вы видь, наверняка удалили пробелы в его скрипте, от этого и такая ошибка. Но если пробелы не удалять, тогда при первом срабатывании перед добавленным текстом будет длиннющий пробел.

Цитата:

Цитата Oleg48
файл непустой однострочный »

Это кстати приемлимо.

Oleg48 10-04-2012 00:37 1896736

Цитата:

Цитата Raf-9600
set tekct=;multitest »

Сдесь обязательно ; ?
Raf-9600, я несильно большой дока в написании командных файлов, у меня вроде работает как я задумал, а вам удачи :) !!!

Raf-9600 10-04-2012 00:40 1896739

Цитата:

Цитата Oleg48
Сдесь обязательно ; ? »

Да! =)

Цитата:

Цитата Oleg48
я несильно большой дока в написании командных файлов »

И, тем не менее, благодарю за попытку помочь :)

Morpheus 10-04-2012 00:40 1896740

Raf-9600, если файлы будут однострочными, то в чём тогда проблема?
Если
Цитата:

Цитата Oleg48
1) файла нет
2) файл непустой однострочный »

cм.#15 или #19.
Если
Цитата:

Цитата Morpheus
1. Файл с текстом
2. Файл пустой
3. Файла нет »

cм.#19.

Raf-9600 10-04-2012 00:51 1896749

Цитата:

Цитата Oleg48
у меня вроде работает как я задумал »

Удалите текстовый файл и один раз запустите свой скрипт (тот который с лишними пробелами), тогда перед добавленным словом будет длиннющий пробел. Или удалите лишние пробелы в своем скрипте и дважды его запустите, тогда заметите другую ошибку.

Цитата:

Цитата Morpheus
то в чём тогда проблема? »

Ага, нашел проблему. В вашем скрипте, если добавляемый текст вначале содержит знак ; то текст который уже есть в файле удаляется и записывается новый. Это реально как-то обойти?

Oleg48 10-04-2012 01:00 1896755

Вложений: 1
Вот мой оригинальный скрипт, в нем только добавлена строка
Код:

SETLOCAL enabledelayedexpansion
в нужном месте

Raf-9600 10-04-2012 01:05 1896760

Oleg48, Да, вроде бы работает как надо. Ошибка возникает только если вначале добавляемого текста поставить точку с запятой ( ; ). Это реально как-то обойти?..

Morpheus 10-04-2012 01:13 1896765

Raf-9600, задайте какой-нибудь символ, с которого ваша строчка не может начинаться:
Код:

@Echo Off
set file=D:\123.txt
set text=text

For /F "eol=' tokens=*" %%i In (%file%) Do Set ti=%%i%text%
if "%ti%"=="" (
echo %text%>%file%
) else (
echo %ti%>%file%
)
pause

Точка с запятой просто по умолчанию обозначает начало комментария и такие строки пропускаются. Символ можно переназначить.

Oleg48 10-04-2012 01:15 1896766

Raf-9600,
Код:

set tekct=^;Этот_текст_надо_дописать
срабатывает только один первый раз когда файла еще нет

Raf-9600 10-04-2012 01:22 1896770

Цитата:

Цитата Oleg48
срабатывает только один первый раз когда файла еще нет »

Даже без символа ( ^ ) тоже в первый раз срабатывает, а вот на второй и третий немного глючит... а на остальные срабатывает %)

Цитата:

Цитата Morpheus
задайте какой-нибудь символ, с которого ваша строчка не может начинаться »

Вот это вроде бы подходит. Спасибо огромное!

Morpheus 10-04-2012 01:31 1896773

Raf-9600, пожалуйста! :)

Oleg48 10-04-2012 01:40 1896775

Morpheus, все работает, сказал спасибо, мне вроде и ненадо, а может когда пригодится.
Цитата:

Цитата Morpheus
eol=' »

Интересный ключик

А все таки, такой скрипт, но с добавлением текста в конец многострочного текстового файла, кто-нибудь сваяет? :)

Morpheus 10-04-2012 02:08 1896780

Цитата:

Цитата Oleg48
Интересный ключик »

Самое интересное, какой бред написан в справке.
XP:
Цитата:

eol=c Specifies an end of line character (just one character).
...
for /F "eol=; tokens=2,3* delims=," %i in (myfile.txt) do @echo %i %j %k
This command parses each line in Myfile.txt, ignoring lines that begin with a semicolon and ...
http://www.microsoft.com/resources/d....mspx?mfr=true

7:
Цитата:

eol=c - specifies an end of line comment character
eol=c - знак начала комментария в конце строки
- вообще вынос мозга.

Цитата:

Цитата Oleg48
А все таки, такой скрипт, но с добавлением текста в конец многострочного текстового файла, кто-нибудь сваяет? »

А если оно никому не нужно, то стоит ли тратить силы?


Время: 22:32.

Время: 22:32.
© OSzone.net 2001-