نمونه های اسکریپت نویسی

راهنمای زبان اسکریپت

این راهنما مقدمه ای بر زبان برنامه نویسی قدرتمند داخلی RouterOS ارائه می دهد.

میزبان اسکریپت راهی برای خودکار کردن برخی از وظایف نگهداری روتر با استفاده از اجرای اسکریپت های تعریف شده توسط کاربر که به برخی از رویدادها محدود شده اند، ارائه می دهد.

اسکریپت ها را می توان در مخزن اسکریپت ذخیره کرد یا  مستقیماً در کنسول   نوشت . رویدادهایی که برای راه اندازی اجرای اسکریپت استفاده می شوند شامل، اما نه محدود به System Scheduler ، ابزار نظارت بر ترافیک ، و رویدادهای تولید شده از ابزار Netwatch هستند.    

اگر قبلاً با اسکریپت نویسی در RouterOS آشنا هستید، ممکن است بخواهید نکات و ترفندهای ما را ببینید . 

ساختار خط

اسکریپت RouterOS به تعدادی خط فرمان تقسیم می شود. خطوط فرمان یک به یک تا پایان اسکریپت یا تا زمانی که خطای زمان اجرا رخ دهد اجرا می شود.

خط فرمان

کنسول RouterOS از دستور دستور زیر استفاده می کند:

[prefix] [path] command [uparam] [param=[value]] .. [param=[value]]

  • [prefix] – کاراکتر “:” یا “/” که نشان می دهد یک فرمان ICE یا مسیر است. ممکن است مورد نیاز نباشد.  
  • [path] – مسیر نسبی به سطح منوی مورد نظر. ممکن است مورد نیاز نباشد.
  • command – یکی از دستورات موجود در سطح منوی مشخص شده.  
  • [uparam] – پارامتر بدون نام، در صورت نیاز دستور باید مشخص شود.
  • [params] – دنباله ای از پارامترهای نامگذاری شده به دنبال مقادیر مربوطه

انتهای خط فرمان با علامت “;” نشان داده می شود. یا NEWLINE . گاهی اوقات “;” یا NEWLINE برای پایان دادن به خط فرمان لازم نیست.       

تنها دستور داخل به هیچ کاراکتر پایان فرمان نیاز ندارد. پایان دستور با محتوای کل اسکریپت تعیین می شود (), [] or {} 

				
					:if ( true ) do={ :put "lala" }
				
			

هر خط فرمان داخل خط فرمان دیگری با براکت های مربع “[ ]” (الحاق فرمان) شروع و به پایان می رسد . 

				
					:put [/ip route get [find gateway=1.1.1.1]];
				
			

توجه داشته باشید که کد بالا شامل سه خط فرمان است:

  • :قرار دادن
  • ip route get
  • find gateway=1.1.1.1

خط فرمان را می توان از بیش از یک خط فیزیکی با پیروی از قوانین اتصال خط ساخت . 

خط فیزیکی

یک خط فیزیکی دنباله ای از نویسه ها است که با یک دنباله انتهای خط (EOL) خاتمه می یابد. می توان از هر یک از توالی های پایان خط پلت فرم استاندارد استفاده کرد:

  • یونیکس  – ASCII LF؛
  • ویندوز  – ASCII CR LF;
  • مک  – ASCII CR؛

می توان از قراردادهای استاندارد C برای کاراکترهای خط جدید استفاده کرد (کاراکتر \n).

نظرات

قوانین زیر برای نظر اعمال می شود:

  • یک نظر با یک کاراکتر هش (#) شروع می شود و در انتهای خط فیزیکی به پایان می رسد.
  • RouterOS از نظرات چند خطی پشتیبانی نمی کند.
  • اگر یک کاراکتر # در داخل رشته ظاهر شود، یک نظر در نظر گرفته نمی شود.
مثال
				
					# this is a comment
# next line comment
:global a; # another valid comment
 
:global myStr "part of the string # is not a comment"
				
			

پیوستن به خط

دو یا چند خط فیزیکی ممکن است با استفاده از کاراکتر بک اسلش (\) به خطوط منطقی متصل شوند.

قوانین زیر برای استفاده از بک اسلش به عنوان ابزار اتصال خط اعمال می شود:

  • خطی که به بک اسلش ختم می شود نمی تواند نظر داشته باشد.
  • بک اسلش نظر را ادامه نمی دهد.
  • بک اسلش یک نشانه را به جز حروف الفبای رشته ای ادامه نمی دهد.
  • بک اسلش در جاهای دیگر در خطی خارج از رشته به معنای واقعی کلمه غیرقانونی است.
مثال
				
					:if ($a = true \
    and $b=false) do={ :put "$a $b"; }
:if ($a = true \ # bad comment
    and $b=false) do={ :put "$a $b"; }
# comment \
    continued - invalid (syntax error)
				
			

فضای خالی بین نشانه ها

فضای خالی را می توان برای جدا کردن توکن ها استفاده کرد. فضای خالی بین دو نشانه فقط در صورتی ضروری است که الحاق آنها به عنوان یک نشانه متفاوت تفسیر شود. مثال

				
					{  
    :local a true; :local b false;
# whitespace is not required
    :put (a&&b);
# whitespace is required  
    :put (a and b);
}
				
			

کاراکترهای فضای خالی مجاز نیستند

  • بین “<parameter>=”
  • بین ‘from=’ ‘to=’ ‘step=’ ‘in=’ ‘do=’ ‘else=’

مثال:

				
					#incorrect:
:for i from = 1 to = 2 do = { :put $i }
#correct syntax:
:for i from=1 to=2 do={ :put $i }
:for i from= 1 to= 2 do={ :put $i }
 
#incorrect
/ip route add gateway = 3.3.3.3
#correct
/ip route add gateway=3.3.3.3
				
			
محدوده ها

متغیرها را می توان فقط در مناطق خاصی از اسکریپت به نام scope استفاده کرد. این نواحی نمایان بودن متغیر را تعیین می کنند. دو نوع دامنه وجود دارد –  جهانی  و  محلی. متغیر اعلام شده در یک بلوک فقط در آن بلوک و بلوک های محصور شده توسط آن و فقط پس از نقطه اعلام قابل دسترسی است.

گستره جهانی

گستره جهانی یا root scope محدوده پیش فرض اسکریپت است. به طور خودکار ایجاد می شود و نمی توان آن را خاموش کرد.

محدوده محلی

کاربر می تواند گروه های خود را برای مسدود کردن دسترسی به متغیرهای خاص تعریف کند، این محدوده ها محدوده های محلی نامیده می شوند. هر محدوده محلی در پرانتزهای فرفری (“{ }”) محصور شده است.

				
					{  
    :local a 3;
    {  
        :local b 4;  
        :put ($a+$b);
    } #line below will show variable b in light red color since it is not defined in scope  
    :put ($a+$b);
}
				
			

در متغیر کد بالا،  b  دارای محدوده محلی است و پس از بسته شدن پرانتز قابل دسترسی نخواهد بود.

هر خط نوشته شده در ترمینال به عنوان محدوده محلی در نظر گرفته می شود

به عنوان مثال، متغیر محلی تعریف شده در خط فرمان بعدی قابل مشاهده نخواهد بود و یک خطای نحوی ایجاد می کند.

				
					[admin@MikroTik] > :local myVar a;
[admin@MikroTik] > :put $myVar
syntax error (line 1 column 7)
				
			
متغیرهای سراسری را در محدوده محلی تعریف نکنید.

توجه داشته باشید که حتی متغیر را می توان به عنوان جهانی تعریف کرد، فقط از محدوده خود در دسترس خواهد بود، مگر اینکه به آن ارجاع داده شود که خارج از محدوده قابل مشاهده باشد

				
					{  
    :local a 3;
    {  
        :global b 4;
    }  
    :put ($a+$b);
}
				
			

کد بالا خروجی 3 می دهد، زیرا خارج از محدوده b قابل مشاهده نیست. 

کد زیر مشکل را برطرف می کند و خروجی 7 را می دهد:

				
					{  
    :local a 3;
    {  
        :global b 4;
    }
    :global b;  
    :put ($a+$b);
}
				
			

کلید واژه ها

کلمات زیر کلمات کلیدی هستند و نمی توانند به عنوان نام متغیر و تابع استفاده شوند:

				
					and       or       in
				
			

تعیین کننده ها

نشانه های زیر به عنوان جداکننده در دستور زبان عمل می کنند:

				
					()  []  {}  :   ;   $   / 
				
			

انواع داده ها

زبان برنامه نویسی RouterOS دارای انواع داده های زیر است:

نوعشرح
num (number)– عدد صحیح امضا شده 64 بیتی، ورودی هگزادسیمال ممکن.
bool (boolean)– مقادیر می تواند درست یا غلط باشد
str (string)– character sequence;
ip– آدرس آی پی؛
ip-prefix– پیشوند IP؛
ip6– آدرس IPv6
ip6-prefix– پیشوند IPv6
id (internal ID)– مقدار هگزادسیمال با علامت “*” پیشوند. هر آیتم منو دارای یک شماره منحصر به فرد است – شناسه داخلی.
time– ارزش تاریخ و زمان؛
array– دنباله ای از مقادیر سازماندهی شده در یک آرایه.
nil– نوع متغیر پیش فرض در صورتی که مقداری تخصیص داده نشود.

دنباله های فرار ثابت

دنباله های فرار زیر را می توان برای تعریف کاراکترهای خاص در یک رشته استفاده کرد:

\”درج دو نقل قول
\\درج بک اسلش
\nدرج خط جدید
\rدرج کرییج برگشت
\ tدرج زبانه افقی
\$Output $ character. Otherwise از $ برای پیوند دادن متغیر استفاده می شود.
Output ? character. Otherwise ? برای چاپ “راهنما” در کنسول استفاده می شود. از نسخه 7.1rc2 حذف شد
\_– فضا
– BEL (0x07)
\b– Backspace (0x08)
\f– فید فرم (0xFF)
\ vدرج زبانه عمودی
\xxیک کاراکتر چاپی از مقدار هگز. اعداد هگز باید از حروف بزرگ استفاده کنند.
مثال
				
					:put "\48\45\4C\4C\4F\r\nThis\r\nis\r\na\r\ntest";
				
			

که روی نمایشگر نشان داده خواهد شد
HELLO
This
is
a
test

اپراتورها

عملگرهای حسابی

عملگرهای معمولی حسابی در زبان برنامه نویسی RouterOS پشتیبانی می شوند

اپراتورشرحمثال
“+”اضافه دودویی:put (3+4);
“-“تفریق باینری:put (1-6);
“*”ضرب دودویی:put (4*5);
“/”تقسیم دودویی:put (10 / 2); :put ((10)/2)
“%”عملیات مدولو:put (5 % 3);
“-“نفی واحد{ :local a 1; :put (-a); }

توجه:  برای اینکه تقسیم کار کند، باید از پرانتز یا فضاهای اطراف سود سهام استفاده کنید تا به عنوان یک آدرس IP اشتباه نشود.

اپراتورهای رابطه ای

اپراتورشرحمثال
“<“کمتر:put (3<4);
“>”بزرگتر:put (3>4);
“=”برابر:put (2=2);
“<=”کمتر یا مساوی 
“>=”بزرگتر یا مساوی 
“!=”نا برابر 

عملگرهای منطقی

اپراتورشرحمثال
“!”logical NOT:put (!true);
“&&”, “and”logical AND:put (true&&true)
“||”, “or”logical OR:put (true||false);
“in” :put (1.1.1.1/32 in 1.0.0.0/8);

اپراتورهای بیتی

اپراتورهای بیتی در حال کار بر روی انواع داده آدرس شماره، IP و IPv6 هستند . 

اپراتورشرحمثال
“~”وارونگی بیت:put (~0.0.0.0)
:put (~::ffff)
“|”بیتی OR. عملیات OR منطقی را روی هر جفت بیت مربوطه انجام می دهد. در هر جفت اگر یکی از بیت ها یا هر دو بیت “1” باشد، نتیجه “1” است، در غیر این صورت نتیجه “0” است.:put (192.168.88.0|0.0.0.255)
:put (2001::1|::ffff)
“^”به صورت بیتی XOR. همان OR است، اما نتیجه در هر موقعیت “1” است اگر دو بیت مساوی نباشند و “0” اگر بیت ها مساوی باشند.:put (1.1.1.1^255.255.0.0)
:put (2001::ffff:1^::ffff:0)
“&”به صورت بیتی و. در هر جفت، اگر بیت اول و دوم “1” باشد، نتیجه “1” است. در غیر این صورت، نتیجه “0” است.:put (192.168.88.77&255.255.255.0)
:put (2001::1111&ffff::)
“<<“تغییر سمت چپ با مقدار معینی از بیت ها، برای نوع داده آدرس IPv6 پشتیبانی نمی شود:put (192.168.88.77<<8)
“>>”جابجایی به راست توسط مقدار معینی از بیت ها، برای نوع داده آدرس IPv6 پشتیبانی نمی شود:put (192.168.88.77>>24)

آدرس زیر شبکه را از IP داده شده و CIDR Netmask با استفاده از عملگر “&” محاسبه کنید:

				
					{
:local IP 192.168.88.77;
:local CIDRnetmask 255.255.255.0;
:put ($IP&$CIDRnetmask);
}
				
			

8 بیت آخر را از آدرس های IP داده شده دریافت کنید:

				
					:put (192.168.88.77&0.0.0.255);
				
			

از “|” استفاده کنید اپراتور و ماسک CIDR معکوس برای محاسبه آدرس پخش:

				
					{
:local IP 192.168.88.77;
:local Network 192.168.88.0;
:local CIDRnetmask 255.255.255.0;
:local InvertedCIDR (~$CIDRnetmask);
:put ($Network|$InvertedCIDR)
}
				
			

اپراتورهای الحاق

اپراتورشرحمثال
“.”دو رشته را به هم متصل می کند:put ("concatenate" . " " . "string");
“”دو آرایه را به هم متصل می کند یا یک عنصر به آرایه اضافه می کند:put ({1;2;3} , 5 );

اضافه کردن مقادیر متغیر به رشته ها بدون عملگر الحاق امکان پذیر است:

				
					:global myVar "world";
 
:put ("Hello " . $myVar);
# next line does the same as above
:put "Hello $myVar";
				
			

با استفاده از $[] و $() در رشته می توان عباراتی را در داخل رشته ها اضافه کرد:

				
					:local a 5;
:local b 6;
:put " 5x6 = $($a * $b)";
 
:put " We have $[ :len [/ip route find] ] routes";
				
			

سایر اپراتورها

اپراتورشرحمثال
“[]”تعویض فرمان می تواند تنها شامل یک خط فرمان باشد:put [ :len "my test string"; ];
“()”عملگر فرعی یا گروه بندی:put ( "value is " . (4+5));
“$”اپراتور تعویض:global a 5; :put $a;
“~”عملگر باینری که مقدار را با عبارت منظم توسعه یافته POSIX مطابقت می دهدتمام مسیرهایی که دروازه آنها به 202 ختم می شود را چاپ کنید
/ip route print where gateway~"^[0-9 \\.]*202\$"
“->”یک عنصر آرایه به کلید دریافت کنید
[admin@x86] >:global aaa {a=1;b=2}
[admin@x86] > :put ($aaa->"a")
1
[admin@x86] > :put ($aaa->"b")
2

متغیرها

زبان برنامه نویسی دارای دو نوع متغیر است:

  • جهانی  – قابل دسترسی از تمام اسکریپت های ایجاد شده توسط کاربر فعلی، تعریف شده با کلمه کلیدی جهانی .  
  • محلی – فقط در محدوده  فعلی قابل دسترسی است که با کلمه کلیدی محلی تعریف شده است .   

ممکن است متغیرهای تعریف نشده ای وجود داشته باشد . وقتی متغیری تعریف نشده باشد، تجزیه‌کننده سعی می‌کند به دنبال متغیرهای تنظیم‌شده، به‌عنوان مثال، توسط DHCP lease-script یا Hotspot در ورود به سیستم باشد.     

هر متغیر، به جز متغیرهای RouterOS داخلی، باید قبل از استفاده توسط کلمات کلیدی محلی یا سراسری اعلام شود. متغیرهای تعریف نشده به عنوان تعریف نشده علامت گذاری می شوند و منجر به خطای کامپایل می شوند. مثال:

				
					# following code will result in compilation error, because myVar is used without declaration
:set myVar "my value";
:put $myVar
				
			

کد صحیح:

				
					:local myVar;
:set myVar "my value";
:put $myVar;
				
			

استثنا زمانی است که از متغیرهای تنظیم شده، به عنوان مثال، توسط DHCP  lease-script استفاده کنید

				
					/system script
add name=myLeaseScript policy=\
    ftp,reboot,read,write,policy,test,winbox,password,sniff,sensitive,api \
    source=":log info \$leaseActIP\r\
    \n:log info \$leaseActMAC\r\
    \n:log info \$leaseServerName\r\
    \n:log info \$leaseBound"
 
/ip dhcp-server set myServer lease-script=myLeaseScript
				
			

کاراکترهای معتبر در نام متغیرها حروف و اعداد هستند. اگر نام متغیر حاوی هر کاراکتر دیگری باشد، نام متغیر باید در دو گیومه قرار گیرد. مثال:

				
					#valid variable name
:local myVar;
#invalid variable name
:local my-var;
#valid because double quoted
:global "my-var";
				
			

اگر یک متغیر در ابتدا بدون مقدار تعریف شود، نوع  داده متغیر روی صفر  تنظیم می شود ، در غیر این صورت، یک نوع داده به طور خودکار توسط موتور برنامه نویسی تعیین می شود. گاهی اوقات تبدیل از یک نوع داده به نوع دیگر مورد نیاز است. با استفاده از دستورات تبدیل داده می توان به آن دست یافت . مثال:  

				
					#convert string to array
:local myStr "1,2,3,4,5";
:put [:typeof $myStr];
:local myArr [:toarray $myStr];
:put [:typeof $myArr]
				
			

نام متغیرها به حروف بزرگ و کوچک حساس هستند.

				
					:local myVar "hello"
# following line will generate error, because variable myVAr is not defined
:put $myVAr
# correct code
:put $myVar
				
			

دستور Set بدون مقدار متغیر را از حالت تعریف خارج می کند (حذف از محیط، جدید در نسخه 6.2)

				
					#remove variable from environment
:global myVar "myValue"
:set myVar;
				
			

زمانی که نام متغیر شامل عملگرها باشد، از نقل قول در نام کامل متغیر استفاده کنید. مثال:

				
					:local "my-Var";
:set "my-Var" "my value";
:put $"my-Var";
				
			

نام متغیرهای رزرو شده

همه ویژگی های RouterOS داخلی متغیرهای رزرو شده هستند. متغیرهایی که مشابه ویژگی های داخلی RouterOS تعریف می شوند، می توانند باعث ایجاد خطا شوند. برای جلوگیری از چنین خطاهایی، از عناوین سفارشی استفاده کنید.

به عنوان مثال، اسکریپت زیر کار نخواهد کرد:

				
					{
:local type "ether1";
/interface print where name=$type;
}
				
			

اما با متغیرهای تعریف شده متفاوت کار خواهد کرد:

				
					{
:local customname "ether1";
/interface print where name=$customname;
}
				
			

دستورات

دستورات جهانی

هر دستور جهانی باید با نشانه “:” شروع شود ،  در  غیر این صورت، به عنوان یک متغیر در نظر گرفته می شود

/ go to the root menu 
.. go back by one menu level 
? list all available menu commands and brief descriptions 
global:global <var> [<value>]define a global variable:global myVar "something"; :put $myVar;
local:local <var> [<value>]define the local variable{ :local myLocalVar "I am local"; :put $myVar; }
beep:beep <freq> <length>beep built-in speaker 
convert:convert from=[arg] to=[arg]

Converts specified value from one format to another. By default uses an automatically parsed value, if the “from” format is not specified (for example, “001” becomes “1”, “10.1” becomes “10.0.0.1”, etc.).

from specifies the format of the value – base32, base64, hex, raw, rot13, uri.

to specifies the format of the output value – base32, base64, hex, raw, rot13, URI.

:put [:convert 001 to=hex ]

31

:put [:convert [/ip dhcp-client/option/get hostname raw-value] from=hex to=raw ]

MikroTik

delay:delay <time>do nothing for a given period of time 
environment:environment print <start>print initialized variable information:global myVar true; :environment print;
error:error <output>Generate console error and stop executing the script 
execute:execute <expression>

Execute the script in the background. The result can be written in the file by setting a “file” parameter or printed to the CLI by setting “as-string”.

When using the “as-string” parameter executed script is blocked (not executed in the background).

{
:local j [:execute {/interface print follow where [:log info ~Sname~]}];
:delay 10s;
:do { /system script job remove $j } on-error={}
}
find:find <arg> <arg> <start>return position of a substring or array element:put [:find "abc" "a" -1];
jobname
:jobnamereturn current script name
Limit script execution to single instance
:if ([/system script job print count-only as-value where script=[:jobname] ] > 1) do={
  :error "script instance already running"
  }
len:len <expression>return string length or array element count:put [:len "length=8"];
log:log <topic> <message>write a message to the system log. Available topics are "debug, error, info and warning":log info "Hello from script";
parse:parse <expression>parse the string and return parsed console commands. Can be used as a function.:global myFunc [:parse ":put hello!"];
$myFunc;
pick:pick <var> <start>[<count>]

return range of elements or substring. If the count is not specified, will return only one element from an array.

  • var – value to pick elements from
  • start – element to start picking from (the first element index is 0)
  • count – number of elements to pick starting from the first element with index=0
[admin@MikroTik] > :put [:pick "abcde" 1 3]
bc
put:put <expression>put the supplied argument into the console:put “Hello world”
resolve:resolve <arg>return the IP address of the given DNS name:put [:resolve "www.mikrotik.com"];
retry:retry command=<expr> delay=[num] max=[num] on-error=<expr>Try to execute the given command “max” amount of times with a given “delay” between tries. On failure, execute the expression given in the “on-error” block

:retry command={abc} delay=1 max=2 on-error={:put “got error”}
got error

:retry command={abc} delay=1 max=2 on-error={:put "got error"}
got error
typeof:typeof <var>the return data type of variable:put [:typeof 4];
rndnum:rndnum from=[num] to=[num]random number generator:put [:rndnum from=1 to=99];
rndstr:rndstr from=[str] length=[num]

Random string generator.

from specifies characters to construct the string from and defaults to all ASCII letters and numerals.
length specifies the length of the string to create and defaults to 16.

:put [:rndnum from="abcdef%^&" length=33];

set:set <var> [<value>]assign value to a declared variable.:global a; :set a true;
terminal:terminal terminal related commands 
time:time <expression>return interval of time needed to execute the command:put [:time {:for i from=1 to=10 do={ :delay 100ms }}];
timestamp:timestampreturns the time since epoch, where epoch is January 1, 1970 (Thursday), not counting leap seconds
[admin@MikroTik] > :put [:timestamp]
2735w21:41:43.481891543
or
[admin@MikroTik] > :put [:timestamp]
2735w1d21:41:43.481891543
with the day offset
toarray:toarray <var>convert a variable to the array 
tobool:tobool <var>convert a variable to boolean 
toid:toid <var>convert a variable to internal ID 
toip:toip <var>convert a variable to IP address 
toip6:toip6 <var>convert a variable to IPv6 address 
tonum:tonum <var>convert a variable to an integer 
tostr:tostr <var>convert a variable to a string 
totime:totime <var>convert a variable to time 

دستورات خاص منو

دستورات رایج

دستورات زیر از اکثر زیر منوها در دسترس هستند:

 

 
addadd <param>=<value>..<param>=<value>add new item
removeremove <id>remove selected item
enableenable <id>enable selected item
disabledisable <id>disable selected item
setset <id> <param>=<value>..<param>=<value>change selected items parameter, more than one parameter can be specified at the time. The parameter can be unset by specifying ‘!’ before the parameter.

Example:
/ip firewall filter add chain=blah action=accept protocol=tcp port=123 nth=4,2
print
set 0 !port chain=blah2 !nth protocol=udp

getget <id> <param>=<value>get the selected item’s parameter value
printprint <param><param>=[<value>]print menu items. Output depends on the print parameters specified. The most common print parameters are described here
exportexport [file=<value>]export configuration from the current menu and its sub-menus (if present). If the file parameter is specified output will be written to the file with the extension ‘.rsc’, otherwise the output will be printed to the console. Exported commands can be imported by import command
editedit <id> <param>edit selected items property in the built-in text editor
findfind <expression>Returns list of internal numbers for items that are matched by given expression. For example:  :put [/interface find name~"ether"]
وارد كردن

دستور import از منوی ریشه در دسترس است و برای وارد کردن پیکربندی از فایل های ایجاد شده توسط یک  فرمان صادرات  یا نوشته شده به صورت دستی با دست استفاده می شود.

پارامترهای چاپ

چندین پارامتر برای دستور چاپ موجود است:

append  
as-valueprint output as an array of parameters and its values:put [/ip address print as-value]
briefprint brief description 
detailprint detailed description, the output is not as readable as brief output but may be useful to view all parameters 
count-onlyprint only count of menu items 
fileprint output to a file 
followprint all current entries and track new entries until ctrl-c is pressed, very useful when viewing log entries/log print follow
follow-onlyprint and track only new entries until ctrl-c is pressed, very useful when viewing log entries/log print follow-only
fromprint parameters only from specified item/user print from=admin
intervalcontinuously print output in a selected time interval, useful to track down changes where follow is not acceptable/interface print interval=2
terseshow details in a compact and machine-friendly format 
value-listshow values single per line (good for parsing purposes) 
without-pagingIf the output does not fit in the console screen then do not stop, print all information in one piece 
whereexpressions followed by where parameters can be used to filter outmatched entries/ip route print where interface="ether1"

بیش از یک پارامتر را می توان در یک زمان مشخص کرد، به عنوان مثال، /ip route print count-only interval=1 where interface="ether1"

حلقه ها و عبارات شرطی

حلقه ها

فرماننحوشرح
do..while:do { <commands> } while=( <conditions> ); :while ( <conditions> ) do={ <commands> };دستورات را تا زمانی که یک شرط داده شده برآورده شود اجرا کنید.
for:for <var> from=<int> to=<int> step=<int> do={ <commands> }دستورات را در تعداد معینی از تکرارها اجرا کنید
foreach:foreach <var> in=<array> do={ <commands> };دستورات را برای هر عنصر در یک لیست اجرا کنید

بیانیه مشروط

فرماننحوشرح
if:if (<condition>) do={<commands>} else={<commands>} <expression>اگر یک شرط داده شده است، دستورات را در بلوک اجرا کنید ، در غیر این صورت اگر مشخص شده است ، دستورات را در بلوک اجرا کنید . true  do  else 

مثال:

				
					{  
    :local myBool true;  
    :if ($myBool = false) do={ :put "value is false" } else={ :put "value is true" }
}
				
			

کارکرد

زبان اسکریپت به شما اجازه ایجاد مستقیم توابع را نمی دهد، با این حال، می توانید از دستور :parse به عنوان راه حل استفاده کنید.

با شروع از v6.2، دستور جدیدی برای تعریف آسان تر چنین توابعی و حتی پاس کردن پارامترها اضافه شده است. همچنین امکان برگرداندن مقدار تابع با دستور :return وجود دارد .  

نمونه های زیر را ببینید:

				
					#define function and run it
:global myFunc do={:put "hello from function"}
$myFunc
 
output:
hello from function
 
#pass arguments to the function
:global myFunc do={:put "arg a=$a"; :put "arg '1'=$1"}
$myFunc a="this is arg a value" "this is arg1 value"
 
output:
arg a=this is arg a value
arg '1'=this is arg1 value
				
			

توجه داشته باشید که دو روش برای ارسال آرگومان وجود دارد:

  • arg را با یک نام خاص ارسال کنید (در مثال ما “a”)
  • مقدار پاس بدون نام arg، در چنین مواردی arg “1”، “2” .. “n” استفاده می شود.

نمونه برگرداندن

				
					:global myFunc do={ :return ($a + $b)}
:put [$myFunc a=6 b=2]
 
output:
8
				
			

حتی می توانید یک اسکریپت موجود را از محیط اسکریپت کلون کنید و از آن به عنوان یک تابع استفاده کنید.

				
					#add script
/system script add name=myScript source=":put \"Hello $myVar !\""
 
:global myFunc [:parse [/system script get myScript source]]
$myFunc myVar=world
 
output:
Hello world !
				
			
اگر تابع حاوی یک متغیر جهانی تعریف شده باشد که نام‌ها با نام پارامتر تصویب شده مطابقت داشته باشد، متغیر تعریف شده در سطح جهانی برای سازگاری با اسکریپت‌های نوشته شده برای نسخه‌های قدیمی نادیده گرفته می‌شود. این ویژگی می تواند در نسخه های بعدی تغییر کند. از استفاده از پارامترهای همنام با متغیرهای سراسری خودداری کنید. 

مثلا:

				
					:global my2 "123"
 
:global myFunc do={ :global my2; :put $my2; :set my2 "lala"; :put $my2 }
$myFunc my2=1234
:put "global value $my2"
				
			

خروجی خواهد بود:

				
					1234
lala
global value 123
				
			

مثال تابع تو در تو

توجه:  برای فراخوانی تابع دیگری باید نام آن اعلام شود (همانطور که برای متغیرها وجود دارد)

				
					:global funcA do={ :return 5 }
:global funcB do={  
    :global funcA;  
    :return ([$funcA] + 4)
}
:put [$funcB]
 
Output:
9
				
			

خطاهای زمان اجرا را بگیرید

شروع از نسخه 6.2 اسکریپت نویسی این قابلیت را دارد که خطاهای زمان اجرا را بگیرد.

به عنوان مثال، دستور [code]:reslove[/code] در صورت عدم موفقیت، یک خطا ایجاد می کند و اسکریپت را خراب می کند.

				
					[admin@MikroTik] > { :put [:resolve www.example.com]; :put "lala";}
failure: dns name does not exist
				
			

حالا می خواهیم این خطا را بگیریم و با اسکریپت خود ادامه دهیم:

				
					:do {  
    :put [:resolve www.example.com];
} on-error={ :put "resolver failed"};
:put "lala"
 
output:
 
resolver failed
lala
				
			

عملیات با آرایه ها

اخطار:  نام کلید در آرایه حاوی هر کاراکتری غیر از حروف کوچک است، باید در گیومه قرار داده شود.

مثلا:

				
					[admin@ce0] > {:local a { "aX"=1 ;; ay=2 }; :put ($a->"aX")}
1
				
			

از میان کلیدها و مقادیر حلقه بزنید

دستور “foreach” را می توان برای حلقه زدن کلیدها و عناصر استفاده کرد:

				
					[admin@ce0] > :foreach k,v in={2; "aX"=1 ;; y=2; 5} do={:put ("$k=$v")}
 
0=2
1=5
aX=1
y=2
				
			

اگر دستور “foreach” با یک آرگومان استفاده شود، مقدار عنصر برگردانده می شود:

				
					[admin@ce0] > :foreach k in={2; "aX"=1 ;; y=2; 5} do={:put ("$k")}
 
2
5
1
2
				
			

توجه:  اگر عنصر آرایه دارای یک کلید باشد، این عناصر به ترتیب حروف الفبا مرتب می شوند، عناصر بدون کلید قبل از عناصر دارای کلید منتقل می شوند و ترتیب آنها تغییر نمی کند (به مثال بالا مراجعه کنید).

مقدار یک عنصر آرایه را تغییر دهید

				
					[admin@MikroTik] > :global a {x=1; y=2}
[admin@MikroTik] > :set ($a->"x") 5 
[admin@MikroTik] > :environment print 
a={x=5; y=2}
				
			

مخزن اسکریپت

سطح زیر منو: /system script

شامل تمام اسکریپت های ایجاد شده توسط کاربر است. اسکریپت ها را می توان به چند روش مختلف اجرا کرد:

  • on event   – اسکریپت ها به طور خودکار در برخی از رویدادهای تسهیلات اجرا می شوند (  زمان بندی ، netwatch ، VRRP )  
  • by another script  – اجرای اسکریپت در داخل اسکریپت مجاز است
  • manually   – از کنسول اجرای دستور  اجرا  یا در winbox

توجه:  فقط اسکریپت‌ها (از جمله زمان‌بندی‌ها، netwatch و غیره) با حقوق مجوز برابر یا بالاتر می‌توانند اسکریپت‌های دیگر را اجرا کنند.

ویژگیشرح
comment (string; Default: )توضیحات توصیفی برای فیلمنامه
dont-require-permissions (yes | no; Default: no)بررسی مجوزهای دور زدن زمانی که اسکریپت در حال اجرا است، زمانی مفید است که اسکریپت ها از سرویس هایی که مجوزهای محدودی دارند، مانند Netwatch، اجرا می شوند. 
name (string; Default: “Script[num]”)نام فیلمنامه
policy (string; Default: ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon)

لیست سیاست های قابل اجرا:

  • ftp  – می تواند از راه دور از طریق FTP وارد سیستم شود و فایل ها را از روتر ارسال و بازیابی کند
  • password   – تغییر رمز عبور
  • policy   – سیاست های کاربر را مدیریت کنید، کاربر را اضافه و حذف کنید
  • read – می تواند پیکربندی را بازیابی کند
  • reboot  – می تواند روتر را راه اندازی مجدد کند
  • sensitive – اجازه می دهد تا پارامتر “پنهان کردن حساس” را تغییر دهید
  • sniff  – می تواند sniffer، مشعل و غیره را اجرا کند
  • test – می تواند ping، traceroute، تست پهنای باند را اجرا کند
  • write – می تواند پیکربندی را تغییر دهد

توضیحات بیشتر سیاست را در اینجا بخوانید 

منبع  ( رشته ؛)کد منبع اسکریپت

ویژگی های وضعیت فقط خواندنی:

ویژگیشرح
last-started (date)تاریخ و زمانی که اسکریپت آخرین بار فراخوانی شده است.
owner (string)کاربری که اسکریپت را ایجاد کرده است
run-count (integer)شمارنده ای که تعداد دفعات اجرای اسکریپت را محاسبه می کند

دستورات خاص منو

فرمانشرح
run (run [id|name])اسکریپت مشخص شده را با شناسه یا نام اجرا کنید

محیط

سطح زیر منو:

  • /system script environment
  • /environment

شامل تمام متغیرهای تعریف شده توسط کاربر و مقادیر اختصاص داده شده به آنها می باشد.

				
					[admin@MikroTik] > :global example;
[admin@MikroTik] > :set example 123
[admin@MikroTik] > /environment print  
"example"=123
				
			

ویژگی های وضعیت فقط خواندنی:

ویژگیشرح
name (string)نام متغیر
user (string)کاربری که متغیر را تعریف کرده است
value ()مقدار اختصاص داده شده به یک متغیر

کار

سطح زیر منو: /system script job

حاوی لیستی از تمام اسکریپت های در حال اجرا است.
ویژگی های وضعیت فقط خواندنی:

ویژگیشرح
owner (string)کاربری که اسکریپت را اجرا می کند
policy (array)فهرست تمام خط مشی های اعمال شده در اسکریپت
started (date)تاریخ و زمان محلی شروع اسکریپت