Некоторые картинки не загружаются из РФ и РК, используйте VPN.

вторник, 18 июля 2023 г.

Mikrotik script copy file from internal memory to internal memory

 Задача банальная, но сначала она ввела меня в ступор, ибо copy в /file нету. А решение банальное - в set contents направить get contents

/file set myFile.txt contents=[/file get SourceFile.txt contents]

Также не стоит забывать про ограничение на размер переменной 4096 байта, а в данном примере мы как раз сталкиваемся с этим ограничением

Плюс к этому, файл приемник должен существовать. Оригинальная инструкция с сайта mikrotik:

/file print file=myFile
/file set myFile.txt contents=""

Ошибки тут нет, к файлам добавляется расширение txt и это не поправить.

Но на wapLTE получаю ошибку no such item, так как файл не успевает создаться до выполнения второй строки. Добавляем паузу

/file print file=myFile
delay 2
/file set myFile.txt contents=""

Таким образом наш скрипт будет выглядеть так:

:local FileName "MyFile.txt"
:local Contents ([/file get SourceFile.txt contents])
/file print file=$FileName
delay 2
if ([:len [/file find where name=$FileName]]>0) do={
	/file set $FileName contents=$Contents
}else={
	:put "File not found"
}

А как дописать в тот же файл?

/file set myFile.txt contents=([/file get myFile.txt contents] . "\r\nBlalalala")

но и здесь работает ограничение 4096, поэтому слить 2+ файла <4096 bite в один файл >4096 не получится

А как скопировать или сформировать большой файл?, ограничение 4096 байт распространяется только на размер переменной

Вот тут можно провернуть фокус execute + put

:local mergeFile "
:local contents [/file get MyFile.txt contents]
:put \$contents
:put \$contents
:put \$contents
:put \$contents
"
:execute script=$mergeFile file=test

Но и в этом примере есть ограничение - источник не может быть больше 4096, плюс к имени файла будет добавлено расширение txt (переименовываем файлы).

Если нужно просто скопировать большой файл, то можно выполнить трюк с переименовыванием, исправил скрипт 16/09/2023.

И еще очень важный момент, данный трюк выполняется отдельно, а родительская программа будет работать дальше, т.о. если используются глобальные переменные с последующим удалением, то требуется установить паузу перед удалением.

Комментариев нет:

Отправить комментарий