Задача банальная, но сначала она ввела меня в ступор, ибо 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.
И еще очень важный момент, данный трюк выполняется отдельно, а родительская программа будет работать дальше, т.о. если используются глобальные переменные с последующим удалением, то требуется установить паузу перед удалением.