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

kosmopes 10-03-2011 18:28 1631719

Чтение содержимого текстового файла в переменную
 
В батнике нужно прочитать небольшой текстовый файл в строковую переменную полностью.

Командой

set /p comment=< comment.txt

переменной comment присваиваются только первые 1036 символов файла.

Есть ли возможность прочитать весь файл в переменную?

В файле несколько тысяч символов. Спецсимволы (и кавычки) заскринены как надо, концы строк убраны. В файле по сути одна длинная строка.
Ручное присвоение содержимого текстового файла непосредственно в батнике командой set "comment=бла-бла-бла, содержимое файла до конца" переменную меняет.
Хочется же автоматической подстановки из файла.

Тестировалось на разных русских и английских текстах - результат один и тот же: только 1036 символов.
Система XPsp3 32bit. Формат пакетного файла cmd (да и с bat - только первые 1036 символов).
По линку http://support.microsoft.com/kb/830473/en-us говорят о 8191 символе для командной строки и переменных окружения для XP.
Мои системные переменные окружения занимают 1248 байт, то есть должно оставаться ещё 6-7 тысяч байт.

gora 10-03-2011 19:10 1631737

Цитата:

Цитата kosmopes
В файле по сути одна длинная строка. »

Попробуйте так:
Код:

@Echo Off
:: Файл с текстом
Set file=e:\Temp\list 1.txt

For /F "usebackq tokens=* delims=" %%i In ("%file%") Do Set var=%%i

:: Запись переменной в файл для проверки
Echo %var%>test.txt


kosmopes 11-03-2011 12:58 1632312

gora, да, спасибо - до этого вчера и доискался.

Теперь борюсь за чтение в переменную нескольких строк из файла. Если текст в файле разбить на строки, вашей конструкцией считывается только последняя строка (или абзац одной строкой). Читал что-то про отложенное раскрытие переменных в цикле FOR http://www.robvanderwoude.com/variableexpansion.php

Универсально сработала конструкция

@setlocal ENABLEDELAYEDEXPANSION
@FOR /F "tokens=*" %%i IN (comment.txt) do @IF NOT X%%i==X set comment=!comment!%%i
...
@endlocal


- читает из файла всё, игнорирует в файле пустые строки и абзацы - просто склеивает текст в одну строку.
Написал IF NOT X%%i==X потому что не знаю, как проверить %%i на пустое значение по-другому - побоялся, что оно может быть либо пустым, либо "" - и вдруг это будут разные значения.
При таком коде надо учесть, что строки склеиваются непосредственно - без разделителя (пробела, например) между склейками.

В идеале, хорошо бы прочитать в одну переменную текст как есть - с разбиением на строки и абзацы (принципиально в батниках возможно использование таких переменных - разбитых на строки и абзацы?), а потом обработать в переменной возможное вхождение спецсимволов (", <, & и т.п.) - потому как эта переменная будет использоваться как параметр (тег комментария) в кодировщике lame, и необработанный текст может сбить команду кодировки.


Время: 02:11.

Время: 02:11.
© OSzone.net 2001-