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

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

Андрей_Угаров@vk 21-12-2012 13:59 2050348

Как записать в txt файл большой кусок текста с помощью bat
 
Как создать txt файл с большим количеством текста с помощью bat?
Этот текст должен быть с самом batнике

gora 21-12-2012 14:17 2050354

Код:

@Echo Off
Set txtfile=e:\Temp\bigtxt.txt

(Echo Создаем большой текст
Echo Весь текст в батнике
Echo Здесь очень много строк
Echo Но спец. символов здесь нет
Echo Иначе их придется экранировать
Echo А это сложно... :^)
Echo Три пустые строки
Echo.
Echo.
Echo.
Echo Последняя строка
)>"%txtfile%"


Андрей_Угаров@vk 21-12-2012 14:23 2050357

Супер! Спасибо!)

Iska 21-12-2012 16:00 2050413

Или так:
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sFile=BigText.txt
more +10 "%~0">"%sFile%"

endlocal
exit /b 0


Создаем большой текст
Весь текст в батнике
Здесь очень много строк
Так можно и спецсимволы :^)
`~!@#$%^&*()_+|\/.,;:'"
Три пустые строки



Последняя строка


mactepcepbep@vk 27-07-2013 07:35 2191436

подскажите, последний скрипт идеально работает в локальной папке, но я никак не могу заставить его писать в файлы в директории выше, все значки cd ../ работают а вот set sFile ../12345/123.txt уже не работает. мне нужен только относительный путь касательно запускаемого бантика. заранее спасибо.

Foreigner 27-07-2013 08:56 2191440

mactepcepbep@vk,

Тебе не надо "cd ..\"
Код:

set "sFile=%~dp0..\12345\123.txt"

mactepcepbep@vk 27-07-2013 09:27 2191445

thanks, the script works well.

V!RTuE 12-12-2022 04:50 2998567

Цитата:

Цитата Iska
Код:

@echo off
setlocal enableextensions enabledelayedexpansion
set sFile=BigText.txt
more +10 "%~0">"%sFile%"
endlocal
exit /b 0
Создаем большой текст
Весь текст в батнике
Здесь очень много строк
Так можно и спецсимволы :^)
`~!@#$%^&*()_+|\/.,;:'"
Три пустые строки
Последняя строка

»

Возможно ли сделать так, чтобы после этого кода можно было написать другой еще? Просто есть код, который обязательно должен быть в конце.
После more можно ли указать точное количество строк, которое надо скопировать? или такого функционала нет?

megaloman 12-12-2022 09:25 2998574

Цитата:

Цитата V!RTuE
такого функционала нет »

Можно написать с заменой More на вывод Echo в цикле, тогда возможны проблемы со спецсимволами. У Вас что в тексте?
Цитата:

Цитата V!RTuE
Просто есть код, который обязательно должен быть в конце. »

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

@Echo Off
cls
        Set "FileOut=Z:\Box_In\BigText.txt"

        Set /A N=10000000
        FOR /F "usebackq tokens=1 delims=[]" %%i In (`Find /N ":My_Out_Text" "%~dpnx0"`) DO Set /A N=%%i
        >"%FileOut%" more +%N% "%~dpnx0"
Echo 1. Тут можно продолжать писать код
        Call :MyCode
Echo 2. Тут можно продолжать писать код
pause
Exit /b 0

:MyCode
        Echo  Просто есть код, который НЕ обязательно должен быть в конце.
Exit /B

:My_Out_Text
Создаем большой текст
Весь текст в батнике
Здесь очень много строк
Так можно и спецсимволы :^)
`~!@#$%^&*()_+|\/.,;:'"
Три пустые строки
Последняя строка


V!RTuE 12-12-2022 21:25 2998682

Цитата:

Цитата megaloman
Можно написать с заменой More на вывод Echo в цикле, тогда возможны проблемы со спецсимволами. У Вас что в тексте? »

Спецсимволов полно. Текст более 200 строк. Содержимое файла openssl-1.0.0.cnf (программы OpenVPN)
Цитата:

Цитата megaloman
Почему, что, его нельзя оформить процедурой и вставить перед выводимым текстом? »

Нельзя, так как используется этот код . Там обязательное условие, что он должен быть в конце.
В принципе уже задачу решил, но не копируются пустые строки (в данном случае абсолютно не критично), но для красоты хотелось бы. Да и просто на будущее знать как можно реализовать подобную задачу.
Вот рабочий код. Реализовано через поиск начальной и конечной строки
Код:

...
:Createopensslcnf
:: Обязательно должно быть в начале батника или здесь @echo off, иначе некорректно экспортируется текст
:: Допустимо в начале указать @echo on, а в этой части @echo off
@echo off
    Set "FileIn=%~0"
    Set "Key1=# For use with easy-rsa version 2.0 and OpenSSL 1.0.0*"
    Set "Key2=init = 0"
 
    FOR /F "usebackq skip=2 tokens=1 delims=[]" %%i In (`Find /N /I "%Key1%" "%FileIn%"`) DO Set /A N=%%i-1
 
    >"%KEY_CONFIG%" (FOR /F "usebackq delims=" %%i In (`More +%N% "%FileIn%"`) DO (
        Echo %%i|Find /I /V "%Key2%"||(<nul Set /P Str=%%i&Exit /B 0)
    ))
GoTo :EOF

# For use with easy-rsa version 2.0 and OpenSSL 1.0.0*
...
...
init = 0

:: ----------------------------------------
...

P.S.: это часть моего проекта по автоматизации работы с OpenVPN на Windows. Подобных решений нигде не встречал еще
Скрытый текст

Serguei Kouzmine 14-12-2022 06:35 2998794

вам все еще нужно решение ?

выдачу произвольного текста заключенного в теле бат файла в выполнением того что было до и того что после этого текста ?



Код:

cat_embedded_text.cmd
Код:

CMD doing some stuff
If you want

If you want to


If you want to know
If you want to know PowerShell ?
That is all !@#$%^^&*()_ you want to know ...

CMD doing other stuff
CMD doing some other stuff


пример привести не жалко но боюсь флейма :-)

пример печатающего тела

Код:

@echo OFF
echo CMD doing some stuff
powershell.exe "&{ $p = $false; (get-content -path $args[0])| foreach-object {if ($_ -match '^REM D4D5BBCD' ){ $p = $false } if ($p) { $_ } ; if ($_ -match '^REM FAE04EC0'){ $p = $true } } }" %~dpnx0
echo CMD doing other stuff
call :AFTER
goto :EOF
REM FAE04EC0
If you want

If you want to


If you want to know
If you want to know PowerShell ?
That is all !@#$%^^&*()_ you want to know ...

REM D4D5BBCD
:AFTER
echo doing some other stuff
goto :EOF


V!RTuE 14-12-2022 13:56 2998818

Serguei Kouzmine, тут уже комбинирование с powershell идет. а он не на всех компах может корректно работать как показала практика. Например, на win7x64 home basic msdn это не сработает. интересно решение чисто с помощью cmd/bat.

Serguei Kouzmine 14-12-2022 16:28 2998852

добавьте
Код:

-executionpolicy bypass
если все таки не работает покажите диагностику

цмд это очень архаичный интерпретатор и
использовать его это примерно как добывать огонь трением
одним куском дерева о другой
https://ru.wikipedia.org/wiki/%D0%97...B3%D0%BD%D1%8F

нужно иметь серезные причины так вот себя ограничивать

Serguei Kouzmine 14-12-2022 16:37 2998853

Вложений: 1
скриншот

V!RTuE 14-12-2022 21:58 2998881

Serguei Kouzmine, мне надо не на экран вывести текст, а экспортировать его в файл test.txt, например. Как это сделать?
В коде не хватает кавычек, иначе не работает, если есть пробелы в пути до батника
Код:

powershell.exe "&{ $p = $false; (get-content -path $args[0])| foreach-object {if ($_ -match '^REM D4D5BBCD' ){ $p = $false } if ($p) { $_ } ; if ($_ -match '^REM FAE04EC0'){ $p = $true } } }" '%~dpnx0'

DJ Mogarych 14-12-2022 21:59 2998882

Цитата:

Цитата V!RTuE
на win7x64 home basic msdn »

Ставится Powershell 5.1 и всё прекрасно работает.

V!RTuE 14-12-2022 22:12 2998884

Цитата:

Цитата DJ Mogarych
Ставится Powershell 5.1 и всё прекрасно работает. »

Сейчас проверил и там стоит 2.0. Хорошо, когда это личный комп и только на нем запускать надо скрипт. Но нужна максимальная универсальность, чтобы на любом компе, даже старом, всё работало. Поэтому и был выбран cmd/batch.
P.S.: этот код там сработал

Serguei Kouzmine 15-12-2022 18:47 2998956

Цитата:

Цитата V!RTuE
мне надо не на экран вывести текст, а экспортировать его в файл test.txt, например. Как это сделать »


это сделать просто

Код:

set DEBUG=true

.\print_embedded_text.cmd dummy.txt

Код:

CMD doing some stuff
CMD doing other stuff
doing some other stuff
contents of dummy.txt
If you want

If you want to


If you want to know
If you want to know PowerShell ?
That is all !@#$%^^&*()_ you want to know ...


Код:

print_embedded_text.cmd
Код:

@echo OFF
echo CMD doing some stuff
REM NOTE: for some reason cannot break command into multiple lines
REM powershell.exe -executionpolicy bypass ^
REM ...
set OUTPUTFILE=%~1
if "%OUTPUTFILE%" == "" set OUTPUTFILE=output.txt

powershell.exe -executionpolicy bypass "&{ $p = $false; (get-content -path $args[0])| foreach-object {if ($_ -match '^REM DATA_END' ){ $p = $false } if ($p) { $_ } ; if ($_ -match '^REM DATA_START'){ $p = $true } } | out-file -encoding ascii -filepath $args[1] }" "%~dpnx0" "%OUTPUTFILE%"
echo CMD doing other stuff
call :AFTER
if /i "%DEBUG%"=="true" echo contents of %OUTPUTFILE%&&type %OUTPUTFILE%
goto :EOF
REM DATA_START
If you want

If you want to


If you want to know
If you want to know PowerShell ?
That is all !@#$%^^&*()_ you want to know ...

REM DATA_END
:AFTER
echo doing some other stuff
goto :EOF



Время: 22:11.

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