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

понедельник, 19 декабря 2022 г.

Mikrotik script Создать каталог

 Решил я описать скрипт по логике которого, нужно было раскидывать файлы по папкам, и тут выясняется что нельзя взять и создать каталог О_О.

В интернетах предлагают такой вариант

/tool fetch dst-path=MyPath/xxx url="http://127.0.0.1/"

Или такой

/tool fetch dst-path=MyPath/xxx url="http://google.com/"

Но у меня не работает такое, в такой вариант прокатил

/tool fetch dst-path=MyPath/xxx url="https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png"

Чтобы файл не скачивался, вместо xxx ставим точку

/tool fetch dst-path=MyPath/. url="https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png"

Поддиректории через слеш

/tool fetch dst-path=MyPath/subFolder/. url="https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png"

Но такой вариант мне не нравится из-за ненадежности источника скачивания, и я нашел вариант через SMB

/ip smb shares add name=test directory=MyPath
/ip smb shares remove [/ip smb shares find where name=test]

Т.о. для создания структуры, можно описать таким образом

/ip smb shares add name=test directory=MyPath
/ip smb shares set [/ip smb shares find where name=test] name=test directory=MyPath/subFolder
/ip smb shares set [/ip smb shares find where name=test] name=test directory=MyPath/subFolder/subfolder
/ip smb shares remove [/ip smb shares find where name=test]

А как быть, если заранее нельзя определить структуру каталогов? При таком подходе Mikrotik не понимает рекурсии, да и не выдает никаких ошибок. Именно для таких случаев были описаны две простенькие функции:

:global FullPath ""
:global CreateFolder do={
	:global FullPath
	:put ("Create folder with name \"".$NewPath."\"")
	
	if ($FullPath="") do={
		:set FullPath $NewPath
	} else={
		:set FullPath ($FullPath."/".$NewPath)
	}
	
	if ([:len [/file find where name=$crtCnfFullPath]]=0) do={
		do {
			/ip smb shares add name=CreateFolder directory=$FullPath
		} on-error={
			:put "Create folder failed"
		}
		/ip smb shares remove [/ip smb shares find where name=CreateFolder]
	} else={
		:put "Path is exist"
	}
	:put ("Current full path \"".$FullPath."\"")
}

:global CreateTree do={
	:global CreateTree
	:global CreateFolder
	if ([:len $1]>0) do={
		$CreateFolder NewPath=$1
		$CreateTree $2 $3 $4 $5 $6 $7 $8 $9
	}
}

# Call function 
$CreateTree "folder" "sub_folder" "sub_sub_folder" "sub_sub_sub_folder";

:delay 1
/system script environment remove CreateTree
/system script environment remove CreateFolder
/system script environment remove FullPath

Данный подход может создать структуру глубиной 10, но вложенность друг в друга. Вариант с полноценной структурой описывать не буду, но решается на раз при помощи массивов. Собственно и здесь можно было использовать массив, но мне не захотелось


Кстати, при создании файлов через:

/file print file=conf.ovpn

будет создан файл с расширением txt в любом случае, костыль:

/tool fetch dst-path=conf.ovpn url="http://127.0.0.1/"

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

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