Calculation

Discuss RoboTask here
Post Reply
Rukbunker
Posts: 194
Joined: Mon Feb 22, 2016 4:06 pm
Location: Netherlands

Calculation

Post by Rukbunker »

Hey Oleg,

With the DEMO task of simple calculations, I wanted to calculate the size of a folder divided by 1048576 to get the size in MB (and if > 1024, then again divided by 1024 to get GB, but that's later).
I've tested it with a folder, it works. Another folder is bigger and the task goes wrong. See screenshot.
Capture.PNG
Capture.PNG (66.29 KiB) Viewed 8060 times
What is the best way to achieve this?

Code: Select all

;*****************************
;* RoboTask Task file
;* Do not edit in text editor!
;*****************************
 
[Root]
ActionAfterRun=INTEGER|0
Actions=FOLDER
Automat=INTEGER|-1
CatID=INTEGER|161709911
Comment=STRINGLIST
ContinueOnError=INTEGER|0
DoNotStopWhenShutdown=INTEGER|0
ExternalName=STRING|"Task89"
Hide=INTEGER|0
ID=INTEGER|1386133181
LocalVariables=STRING|"Root=\\snlkamfile1\home\"
LogOnAsUser=INTEGER|1
Name=STRING|"Calc the folder size (with basic script) (imported)"
OnErrorTaskID=INTEGER|-1
Priority=INTEGER|3
RunOnClose=INTEGER|0
RunOnStartup=INTEGER|0
ToLog=INTEGER|3
UnicodeFormat=INTEGER|0
WriteGeneralLog=INTEGER|0

[Actions]
Action1=FOLDER
Action10=FOLDER
Action11=FOLDER
Action12=FOLDER
Action13=FOLDER
Action14=FOLDER
Action15=FOLDER
Action2=FOLDER
Action3=FOLDER
Action4=FOLDER
Action5=FOLDER
Action6=FOLDER
Action7=FOLDER
Action8=FOLDER
Action9=FOLDER

[Actions\Action1]
ActionID=STRING|"A_DIALOG_BROWSEFOLDERS"
Enabled=INTEGER|-1
Name=STRING|"Browse for Folders"
Params=FOLDER

[Actions\Action1\Params]
caption=STRING|"Select Folder"
default=STRING|"None"
filter=STRING|"Text files|*.txt|All files|*.*|"
variable=STRING|"FOLDER_TO_CALC"

[Actions\Action10]
ActionID=STRING|"A_VARIABLES_CREATE"
Enabled=INTEGER|-1
Name=STRING|"Create local variable ""RES"" with value """""
Params=FOLDER

[Actions\Action10\Params]
expand=STRING|"0"
varkind=STRING|"1"
varname=STRING|"RES"

[Actions\Action11]
ActionID=STRING|"BASIC_EVALUATE"
Enabled=INTEGER|-1
Name=STRING|"Evaluate"
Params=FOLDER

[Actions\Action11\Params]
expression=STRING|"{var1}/{var2}"
variable=STRING|"RES"

[Actions\Action12]
ActionID=STRING|"A_DIALOG_MESSAGE"
Enabled=INTEGER|-1
Name=STRING|"Show ""Result = {res}"""
Params=FOLDER

[Actions\Action12\Params]
icon=STRING|"1"
msg0=STRING|"Result = {res}"
msgcount=STRING|"1"
playsound=STRING|"0"
showmessage=STRING|"1"

[Actions\Action13]
ActionID=STRING|"A_VARIABLES_REMOVE"
Enabled=INTEGER|-1
Name=STRING|"Remove variable ""FOLDER_TO_CALC"""
Params=FOLDER

[Actions\Action13\Params]
varname=STRING|"FOLDER_TO_CALC"

[Actions\Action14]
ActionID=STRING|"A_VARIABLES_REMOVE"
Enabled=INTEGER|-1
Name=STRING|"Remove variable ""TOTALSIZE"""
Params=FOLDER

[Actions\Action14\Params]
varname=STRING|"TOTALSIZE"

[Actions\Action15]
ActionID=STRING|"A_VARIABLES_REMOVE"
Enabled=INTEGER|-1
Name=STRING|"Remove variable ""FILECOUNT"""
Params=FOLDER

[Actions\Action15\Params]
varname=STRING|"FILECOUNT"

[Actions\Action2]
ActionID=STRING|"A_FLOW_IF"
Enabled=INTEGER|-1
Name=STRING|"If Then"
Params=FOLDER

[Actions\Action2\Params]
case=STRING|"0"
operator=STRING|"0"
type=STRING|"0"
value1=STRING|"{folder_to_calc}"
value2=STRING|"none"

[Actions\Action3]
ActionID=STRING|"A_DIALOG_MESSAGE"
Enabled=INTEGER|-1
Name=STRING|"Show ""You haven't chosen the folder"""
Params=FOLDER

[Actions\Action3\Params]
icon=STRING|"1"
msg0=STRING|"You haven't chosen the folder"
msgcount=STRING|"1"
playsound=STRING|"0"
showmessage=STRING|"1"

[Actions\Action4]
ActionID=STRING|"A_FLOW_ELSE"
Enabled=INTEGER|-1
Name=STRING|"Else"

[Actions\Action5]
ActionID=STRING|"BASIC_SCRIPT"
Enabled=INTEGER|-1
Name=STRING|"Basic Script"
Params=FOLDER

[Actions\Action5\Params]
line00000=STRING|"Public Const MAX_PATH = 260"
line00001=STRING|"Public Const FILE_ATTRIBUTE_DIRECTORY = &H10"
line00003=STRING|"Public Type FILETIME"
line00004=STRING|"        dwLowDateTime As Long"
line00005=STRING|"        dwHighDateTime As Long"
line00006=STRING|"End Type"
line00008=STRING|"Public Type WIN32_FIND_DATA"
line00009=STRING|"        dwFileAttributes As Long"
line00010=STRING|"        ftCreationTime As FILETIME"
line00011=STRING|"        ftLastAccessTime As FILETIME"
line00012=STRING|"        ftLastWriteTime As FILETIME"
line00013=STRING|"        nFileSizeHigh As Long"
line00014=STRING|"        nFileSizeLow As Long"
line00015=STRING|"        dwReserved0 As Long"
line00016=STRING|"        dwReserved1 As Long"
line00017=STRING|"        cFileName As String * MAX_PATH"
line00018=STRING|"        cAlternate As String * 14"
line00019=STRING|"End Type"
line00021=STRING|"Public Declare Function FindClose Lib ""kernel32"" Alias ""FindClose"" (ByVal hFindFile As Long) As Long"
line00022=STRING|"Public Declare Function FindFirstFile Lib ""kernel32"" Alias ""FindFirstFileA"" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long"
line00023=STRING|"Public Declare Function FindNextFile Lib ""kernel32"" Alias ""FindNextFileA"" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long"
line00025=STRING|"Dim FileCount As Long"
line00026=STRING|"Dim TotalSize As Double"
line00028=STRING|"Sub CalcFolder(ByVal AFolder As String)"
line00029=STRING|"	Dim sh As Long"
line00030=STRING|"	Dim FindData As WIN32_FIND_DATA"
line00031=STRING|"	Dim res As Long"
line00032=STRING|"	Dim FileName As String"
line00034=STRING|"	sh = FindFirstFile(AFolder+""\*.*"", FindData)"
line00035=STRING|"	If sh>=0 Then"
line00036=STRING|"		res = 1"
line00037=STRING|"		While res>0"
line00039=STRING|"			FileName = Left(FindData.cFileName, InStr(FindData.cFileName,Chr(0))-1) 'because  FindData.cFileName always containt 260 chars"
line00041=STRING|"			If (FindData.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) = 0 Then 'file"
line00042=STRING|"				FileCount = FileCount + 1"
line00043=STRING|"				TotalSize = TotalSize + FindData.nFileSizeLow"
line00044=STRING|"			Else 'directory"
line00045=STRING|"				If FileName <> ""."" And FileName <> "".."" Then ' !!!important!!! skip ""."" and "".."" pseudofolders"
line00046=STRING|"					CalcFolder(AFolder + ""\"" + FileName)"
line00047=STRING|"				End If"
line00048=STRING|"			End If"
line00049=STRING|"			res = FindNextFile(sh,FindData)"
line00050=STRING|"		Wend"
line00051=STRING|"		FindClose(sh)"
line00052=STRING|"	End If"
line00053=STRING|"End Sub"
line00055=STRING|"Sub Main"
line00056=STRING|"	Dim s As String"
line00057=STRING|"	FileCount=0"
line00058=STRING|"	TotalSize=0"
line00059=STRING|"	s = RoboTaskApp.ExpandText(""{Folder_To_Calc}"")"
line00060=STRING|"	CalcFolder(s)"
line00061=STRING|"	RoboTaskApp.SetUserVariable(""FileCount"", Str(FileCount))"
line00062=STRING|"	RoboTaskApp.SetUserVariable(""TotalSize"", Str(TotalSize))"
line00063=STRING|"End Sub"
linecount=STRING|"64"
source=STRING|"0"

[Actions\Action6]
ActionID=STRING|"A_DIALOG_MESSAGE"
Enabled=INTEGER|-1
Name=STRING|"Show ""Folder ""{Folder_To_Calc}"" contains """
Params=FOLDER

[Actions\Action6\Params]
icon=STRING|"1"
msg0=STRING|"Folder ""{Folder_To_Calc}"" contains "
msg1=STRING|"{FileCount} files"
msg2=STRING|"{TotalSize} bytes"
msgcount=STRING|"3"
playsound=STRING|"0"
showmessage=STRING|"1"

[Actions\Action7]
ActionID=STRING|"A_FLOW_ENDIF"
Enabled=INTEGER|-1
Name=STRING|"End If"

[Actions\Action8]
ActionID=STRING|"A_VARIABLES_CREATE"
Enabled=INTEGER|-1
Name=STRING|"Create local variable ""VAR1"" with value ""{TotalSize}"""
Params=FOLDER

[Actions\Action8\Params]
expand=STRING|"1"
varkind=STRING|"1"
varname=STRING|"VAR1"
varvalue=STRING|"{TotalSize}"

[Actions\Action9]
ActionID=STRING|"A_VARIABLES_CREATE"
Enabled=INTEGER|-1
Name=STRING|"Create local variable ""VAR2"" with value ""1048576"""
Params=FOLDER

[Actions\Action9\Params]
expand=STRING|"1"
varkind=STRING|"1"
varname=STRING|"VAR2"
varvalue=STRING|"1048576"
Oleg
Site Admin
Posts: 3010
Joined: Thu Jan 01, 1970 1:00 am
Contact:

Re: Calculation

Post by Oleg »

Look at the step #11
change the expression to value: {var1}E+0/{var2} or {var1}.0/{var2}

In this case BASIC engine will use 1-st value as a real (or double) value (not an integer)
This works with small values too.

see corrected task below:

Code: Select all

;*****************************
;* RoboTask Task file
;* Do not edit in text editor!
;*****************************
 
[Root]
ActionAfterRun=INTEGER|0
Actions=FOLDER
Automat=INTEGER|0
CatID=INTEGER|444033236
Comment=STRINGLIST
ContinueOnError=INTEGER|0
DoNotStopWhenShutdown=INTEGER|0
ExternalName=STRING|"Task331"
Hide=INTEGER|0
ID=INTEGER|1386133181
LocalVariables=STRING|"Root=\\snlkamfile1\home\"
LogOnAsUser=INTEGER|1
Name=STRING|"Calc the folder size (with basic script)"
OnErrorTaskID=INTEGER|-1
Priority=INTEGER|3
RunOnClose=INTEGER|0
RunOnStartup=INTEGER|0
ToLog=INTEGER|3
UnicodeFormat=INTEGER|0
WriteGeneralLog=INTEGER|0

[Actions]
Action1=FOLDER
Action10=FOLDER
Action11=FOLDER
Action12=FOLDER
Action13=FOLDER
Action14=FOLDER
Action15=FOLDER
Action2=FOLDER
Action3=FOLDER
Action4=FOLDER
Action5=FOLDER
Action6=FOLDER
Action7=FOLDER
Action8=FOLDER
Action9=FOLDER

[Actions\Action1]
ActionID=STRING|"A_DIALOG_BROWSEFOLDERS"
Enabled=INTEGER|-1
Name=STRING|"Browse for Folders"
Params=FOLDER

[Actions\Action1\Params]
caption=STRING|"Select Folder"
default=STRING|"None"
filter=STRING|"Text files|*.txt|All files|*.*|"
variable=STRING|"FOLDER_TO_CALC"

[Actions\Action10]
ActionID=STRING|"A_VARIABLES_CREATE"
Enabled=INTEGER|-1
Name=STRING|"Create local variable ""RES"" with value """""
Params=FOLDER

[Actions\Action10\Params]
expand=STRING|"0"
varkind=STRING|"1"
varname=STRING|"RES"

[Actions\Action11]
ActionID=STRING|"BASIC_EVALUATE"
Enabled=INTEGER|-1
Name=STRING|"Evaluate"
Params=FOLDER

[Actions\Action11\Params]
expression=STRING|"{var1}E+0/{var2}"
variable=STRING|"RES"

[Actions\Action12]
ActionID=STRING|"A_DIALOG_MESSAGE"
Enabled=INTEGER|-1
Name=STRING|"Show ""Result = {res}"""
Params=FOLDER

[Actions\Action12\Params]
icon=STRING|"1"
msg0=STRING|"Result = {res}"
msgcount=STRING|"1"
playsound=STRING|"0"
showmessage=STRING|"1"

[Actions\Action13]
ActionID=STRING|"A_VARIABLES_REMOVE"
Enabled=INTEGER|-1
Name=STRING|"Remove variable ""FOLDER_TO_CALC"""
Params=FOLDER

[Actions\Action13\Params]
varname=STRING|"FOLDER_TO_CALC"

[Actions\Action14]
ActionID=STRING|"A_VARIABLES_REMOVE"
Enabled=INTEGER|-1
Name=STRING|"Remove variable ""TOTALSIZE"""
Params=FOLDER

[Actions\Action14\Params]
varname=STRING|"TOTALSIZE"

[Actions\Action15]
ActionID=STRING|"A_VARIABLES_REMOVE"
Enabled=INTEGER|-1
Name=STRING|"Remove variable ""FILECOUNT"""
Params=FOLDER

[Actions\Action15\Params]
varname=STRING|"FILECOUNT"

[Actions\Action2]
ActionID=STRING|"A_FLOW_IF"
Enabled=INTEGER|-1
Name=STRING|"If Then"
Params=FOLDER

[Actions\Action2\Params]
case=STRING|"0"
operator=STRING|"0"
type=STRING|"0"
value1=STRING|"{folder_to_calc}"
value2=STRING|"none"

[Actions\Action3]
ActionID=STRING|"A_DIALOG_MESSAGE"
Enabled=INTEGER|-1
Name=STRING|"Show ""You haven't chosen the folder"""
Params=FOLDER

[Actions\Action3\Params]
icon=STRING|"1"
msg0=STRING|"You haven't chosen the folder"
msgcount=STRING|"1"
playsound=STRING|"0"
showmessage=STRING|"1"

[Actions\Action4]
ActionID=STRING|"A_FLOW_ELSE"
Enabled=INTEGER|-1
Name=STRING|"Else"

[Actions\Action5]
ActionID=STRING|"BASIC_SCRIPT"
Enabled=INTEGER|-1
Name=STRING|"Basic Script"
Params=FOLDER

[Actions\Action5\Params]
line00000=STRING|"Public Const MAX_PATH = 260"
line00001=STRING|"Public Const FILE_ATTRIBUTE_DIRECTORY = &H10"
line00003=STRING|"Public Type FILETIME"
line00004=STRING|"        dwLowDateTime As Long"
line00005=STRING|"        dwHighDateTime As Long"
line00006=STRING|"End Type"
line00008=STRING|"Public Type WIN32_FIND_DATA"
line00009=STRING|"        dwFileAttributes As Long"
line00010=STRING|"        ftCreationTime As FILETIME"
line00011=STRING|"        ftLastAccessTime As FILETIME"
line00012=STRING|"        ftLastWriteTime As FILETIME"
line00013=STRING|"        nFileSizeHigh As Long"
line00014=STRING|"        nFileSizeLow As Long"
line00015=STRING|"        dwReserved0 As Long"
line00016=STRING|"        dwReserved1 As Long"
line00017=STRING|"        cFileName As String * MAX_PATH"
line00018=STRING|"        cAlternate As String * 14"
line00019=STRING|"End Type"
line00021=STRING|"Public Declare Function FindClose Lib ""kernel32"" Alias ""FindClose"" (ByVal hFindFile As Long) As Long"
line00022=STRING|"Public Declare Function FindFirstFile Lib ""kernel32"" Alias ""FindFirstFileA"" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long"
line00023=STRING|"Public Declare Function FindNextFile Lib ""kernel32"" Alias ""FindNextFileA"" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long"
line00025=STRING|"Dim FileCount As Long"
line00026=STRING|"Dim TotalSize As Double"
line00028=STRING|"Sub CalcFolder(ByVal AFolder As String)"
line00029=STRING|"   Dim sh As Long"
line00030=STRING|"   Dim FindData As WIN32_FIND_DATA"
line00031=STRING|"   Dim res As Long"
line00032=STRING|"   Dim FileName As String"
line00034=STRING|"   sh = FindFirstFile(AFolder+""\*.*"", FindData)"
line00035=STRING|"   If sh>=0 Then"
line00036=STRING|"      res = 1"
line00037=STRING|"      While res>0"
line00039=STRING|"         FileName = Left(FindData.cFileName, InStr(FindData.cFileName,Chr(0))-1) 'because  FindData.cFileName always containt 260 chars"
line00041=STRING|"         If (FindData.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) = 0 Then 'file"
line00042=STRING|"            FileCount = FileCount + 1"
line00043=STRING|"            TotalSize = TotalSize + FindData.nFileSizeLow"
line00044=STRING|"         Else 'directory"
line00045=STRING|"            If FileName <> ""."" And FileName <> "".."" Then ' !!!important!!! skip ""."" and "".."" pseudofolders"
line00046=STRING|"               CalcFolder(AFolder + ""\"" + FileName)"
line00047=STRING|"            End If"
line00048=STRING|"         End If"
line00049=STRING|"         res = FindNextFile(sh,FindData)"
line00050=STRING|"      Wend"
line00051=STRING|"      FindClose(sh)"
line00052=STRING|"   End If"
line00053=STRING|"End Sub"
line00055=STRING|"Sub Main"
line00056=STRING|"   Dim s As String"
line00057=STRING|"   FileCount=0"
line00058=STRING|"   TotalSize=0"
line00059=STRING|"   s = RoboTaskApp.ExpandText(""{Folder_To_Calc}"")"
line00060=STRING|"   CalcFolder(s)"
line00061=STRING|"   RoboTaskApp.SetUserVariable(""FileCount"", Str(FileCount))"
line00062=STRING|"   RoboTaskApp.SetUserVariable(""TotalSize"", Str(TotalSize))"
line00063=STRING|"End Sub"
linecount=STRING|"64"
source=STRING|"0"

[Actions\Action6]
ActionID=STRING|"A_DIALOG_MESSAGE"
Enabled=INTEGER|-1
Name=STRING|"Show ""Folder ""{Folder_To_Calc}"" contains """
Params=FOLDER

[Actions\Action6\Params]
icon=STRING|"1"
msg0=STRING|"Folder ""{Folder_To_Calc}"" contains "
msg1=STRING|"{FileCount} files"
msg2=STRING|"{TotalSize} bytes"
msgcount=STRING|"3"
playsound=STRING|"0"
showmessage=STRING|"1"

[Actions\Action7]
ActionID=STRING|"A_FLOW_ENDIF"
Enabled=INTEGER|-1
Name=STRING|"End If"

[Actions\Action8]
ActionID=STRING|"A_VARIABLES_CREATE"
Enabled=INTEGER|-1
Name=STRING|"Create local variable ""VAR1"" with value ""{TotalSize}"""
Params=FOLDER

[Actions\Action8\Params]
expand=STRING|"1"
varkind=STRING|"1"
varname=STRING|"VAR1"
varvalue=STRING|"{TotalSize}"

[Actions\Action9]
ActionID=STRING|"A_VARIABLES_CREATE"
Enabled=INTEGER|-1
Name=STRING|"Create local variable ""VAR2"" with value ""1048576"""
Params=FOLDER

[Actions\Action9\Params]
expand=STRING|"1"
varkind=STRING|"1"
varname=STRING|"VAR2"
varvalue=STRING|"1048576"
Oleg Yershov
Rukbunker
Posts: 194
Joined: Mon Feb 22, 2016 4:06 pm
Location: Netherlands

Re: Calculation

Post by Rukbunker »

Thanks for the quick reply. It works.
Can I round the number inthe result somehow to a 2-number digit, like xx,yy? (Like this)
Oleg
Site Admin
Posts: 3010
Joined: Thu Jan 01, 1970 1:00 am
Contact:

Re: Calculation

Post by Oleg »

Can I round the number inthe result somehow to a 2-number digit, like xx,yy?
Yes, change the expression in step #11 to this: Round({var1}.0/{var2},2)
Oleg Yershov
Rukbunker
Posts: 194
Joined: Mon Feb 22, 2016 4:06 pm
Location: Netherlands

Re: Calculation

Post by Rukbunker »

Great. I will try it tomorrow. Thanks!
Post Reply