Multi Commander Support Forum

Multi Commander => Script => Topic started by: ajax on July 02, 2018, 23:00:25

Title: Trying to write pretty simple scripts is turning out to be very exasperating!!!
Post by: ajax on July 02, 2018, 23:00:25
Still trying to do what provoked a previous post (http://forum.multicommander.com/forum/index.php/topic,2212.0.html (http://forum.multicommander.com/forum/index.php/topic,2212.0.html)) but am past the documentation stage.  The MultiScript debugger does some nice things but even using it success is quite illusive.  Here are some suggestions which I think would make the debugger much more useful.


Based on inspection of variable values my scripts work correctly but something bad is happening when MC.xxx commands are invoked.

A minor suggestion would be to add a horizontal scroll bar to the panel used for outputting debugger results.  Even on my wide screen display the values are often out of view.
Title: Re: Trying to write pretty simple scripts is turning out to be very exasperating!!!
Post by: ajax on July 05, 2018, 17:52:18
Finally succeeded to get a simple script to work.  Never did figure out what was wrong with prior attempts but a bit of trial and error succeeded.  Now I'd like to figure out how to pass a parameter when invoking the script.  From documentation it looks like this means the script must be launched from the command line but there must be some not so obvious secret to making this work.

I chose the "Alias" button when using "Configuration>User Defined Commands" to create a multiscript.  There is an entry that shows up in the panel displayed when selecting "Configuration>Manage Aliases".  However, nothing seems to happen when the alias name is entered on the command line.

What do I need to do now?
Title: Re: Trying to write pretty simple scripts is turning out to be very exasperating!!!
Post by: AlanJB on July 05, 2018, 18:19:02
Did you look here: http://multicommander.com/docs/aliases (http://multicommander.com/docs/aliases)

to make sure your alias is correctly configured?
Title: Re: Trying to write pretty simple scripts is turning out to be very exasperating!!!
Post by: ajax on July 05, 2018, 21:40:38
In my case the Alias Manager screen lists the name I assigned to the multiscript on the left and a value of @d037fc176448408cb5c744d5bc62ae33 on the right.  That value is what is displayed as the "Unique ID" in the upper right corner of the script editor for the script I want to invoke.

The script works fine in Multicript Debugger but it looks to me as if you cannot test the parameter passing in the debugger.  If that is possible I could use some help figuring out how to do that.  I'm not even able to invoke it without a parameter from the command line.
Title: Re: Trying to write pretty simple scripts is turning out to be very exasperating!!!
Post by: AlanJB on July 06, 2018, 00:20:33
Could you post your MultiScript source here, please?
Title: Re: Trying to write pretty simple scripts is turning out to be very exasperating!!!
Post by: Mathias (Author) on July 06, 2018, 08:04:05
In my case the Alias Manager screen lists the name I assigned to the multiscript on the left and a value of @d037fc176448408cb5c744d5bc62ae33 on the right.  That value is what is displayed as the "Unique ID" in the upper right corner of the script editor for the script I want to invoke.

The script works fine in Multicript Debugger but it looks to me as if you cannot test the parameter passing in the debugger.  If that is possible I could use some help figuring out how to do that.  I'm not even able to invoke it without a parameter from the command line.

If you look at one of the example script that are there after install . "Google Search" there is an alias for this command to.. so when you type "g  <text>" in the command line field.. the script is run. and the script picks up the arguments sent to the script before sending everything to the browser.

If you show the code and descibe what you are trying to do. I think it would be easier to say what you should do

Title: Re: Trying to write pretty simple scripts is turning out to be very exasperating!!!
Post by: ajax on July 06, 2018, 20:34:02
It looks like the problem invoking the multiscript using an alias was attributed to a coding error.  In that, the script probably did execute but when nothing appeared to happen this was not apparent.  However now that I can confirm that it is invoked I'm having trouble picking up the value entered for a parameter.

As requested the script follows:
Code: [Select]
@var $suffix = GetTagValue("${param:0}");
@var $message = "Request to Create a Hard Link (Alias)";
$message += "\nParam0=" + $suffix;
if(StrLen($suffix) <= 0)
{
$suffix = "L1";
}
else if (StrLen($suffix) > 5)
{
$suffix = "L9";
}
@var $filename = GetTagValue("${sourcefocusname}");
@var $linkname = StrSub($filename, 0, StrRFind($filename, "."));
@var $linkext = StrTrimLeft($filename, $linkname);
$linkname += "." + $suffix + $linkext;
@var $linkpath = GetTagValue("${targetpath}");
$message += "\nLinkPath=" + $linkpath;
$message += "\nLinkName=" + $linkname;
@var $tofile = GetTagValue("${sourcefocuspath}");
$message += "\nToFile=" + $tofile;
@var $result = MessageBox("Alias Make", $message, 1);
if($result == 1)
{
MC.Utils.CreateLink ASADMIN LNKTYPE=1 LNKTRG=${sourcefocuspath} LNKSRC=${targetpath}\{$linkname}
}
As you can see I'm assuming the parameter value is string (type of data).  Because I'm uncertain about this I tried using some of the functions described http://multicommander.com/docs/multiscript/corefunctions (http://multicommander.com/docs/multiscript/corefunctions) but this produced an error in the debugger saying that no such function existed.

Right now it looks like my only problem is how to find the value entered as a parameter on the command line.
Title: Re: Trying to write pretty simple scripts is turning out to be very exasperating!!!
Post by: Mathias (Author) on July 06, 2018, 21:24:28
Look at the "Google Search" example.. it picks up the parameters with some variables that gets auto created
$argcount and $arg[] array

The TagValue are not really used with MultiScript unless you have to. They are really created for other bat scripts and customcommands..


Title: Re: Trying to write pretty simple scripts is turning out to be very exasperating!!!
Post by: ajax on July 07, 2018, 15:43:21
OK, I think I see what you mean.  However, this experience again demonstrates the need/desire to be able to test scripts that use this capability with the debugger.  When I code what is shown in your post and would have thought is correct for an array type variable (i.e., $arg[]) nothing happens which I've come to recognize as meaning there is error in the script.  When I looked closer I noticed that the "Google Search" example that you referenced actually codes it instead as "$arg()" which I found perplexing but went ahead and tried anyway.  That worked but then when I invoke the script form the command line but without an argument it fails.  Is there a suggested method for writing a script that can figure out whether or not arguments have been specified on the invoking command?  Might there be an explanation for the alternative syntax used on the $arg variable?
Title: Re: Trying to write pretty simple scripts is turning out to be very exasperating!!!
Post by: Mathias (Author) on July 07, 2018, 16:06:31
The debugger will log out if there are any error that the engine does not understand.
and you run the script in the debugger and it wil run line by line. and you can see all variable that the script engine has in the watch window.

MultiScript are low level. and CustomCommand the the other are high level command, they are used for different things. CustomCommand is like pressing a command  in the UI. (but with preset options) with MultiScript you can access the core function at a more core level.  MultiScritp is not connect to the UI in the same way

No you need to fake parameters while you debug. 99% of script do not actually use parameters.. they act on items in the file list. The get selected items and so on. and do things with that.


Title: Re: Trying to write pretty simple scripts is turning out to be very exasperating!!!
Post by: ajax on July 07, 2018, 20:45:56
Making some progress but still hitting some snags.  Your suggestion about NOT using TagValues in multiscript is something I'm attempting to do.  Now that, I think, I've found the low level functions that do what I need I thought it would be good to change.  I believe this is also going to help with my desire to run scripts on multiple selections.  However I've experienced an anomaly that I cannot explain.

Following is a couple of lines of code that do NOT work -

@var $linkpath = GetTargetPath();
MC.Utils.CreateLink ASADMIN LNKTYPE=1 LNKTRG={$filepath} LNKSRC={$linkpath}\{$linkname}
 
However, if I change to the following it does work -

@var $linkpath = GetTargetPath();
MC.Utils.CreateLink ASADMIN LNKTYPE=1 LNKTRG={$filepath} LNKSRC=${targetpath}\{$linkname}   

Another curious point that is revealed in the debugger is that the value returned by GetTargetPath() and ${targetpath} are the same and both are strings that end with the backslash ('\') character.  However, if I remove the backslash ('\') character shown in the argument to LNKSRC that separates the 2 parts of the fully qualified path then it FAILS to work.  I would expect that after the variable substitution has occurred this would result in the double backslash ('\\') which I'd think does NOT belong there.

Title: Re: Trying to write pretty simple scripts is turning out to be very exasperating!!!
Post by: Mathias (Author) on July 07, 2018, 22:49:56
Windows will ignore double slashes
But you should put " around each path, because if there are space in the path it will cut out when parsing the parameters for the custom command
Also you can build the complete path first into a variable before sending it. then you will see the difference of the complete path

Not sure why it fails. It works here., might be because of some other reason.

Title: Re: Trying to write pretty simple scripts is turning out to be very exasperating!!!
Post by: ajax on July 08, 2018, 18:45:27
OK!  Following is slight change per your suggestion which DOES work -

@var $linkpath = GetTargetPath();
@var $link = $linkpath + $linkname;
MC.Utils.CreateLink ASADMIN LNKTYPE=1 LNKTRG={$filepath} LNKSRC={$link}

which while good still leaves me a bit perplexed when it comes to why.

Above was done for purpose of testing limited change but I have also added the quotes you suggested and that seems to be no problem.  So, per your point is good.

Very grateful for your help.  Well done!
Title: Re: Trying to write pretty simple scripts is turning out to be very exasperating!!!
Post by: Mathias (Author) on July 08, 2018, 21:19:41
OK!  Following is slight change per your suggestion which DOES work -

@var $linkpath = GetTargetPath();
@var $link = $linkpath + $linkname;
MC.Utils.CreateLink ASADMIN LNKTYPE=1 LNKTRG={$filepath} LNKSRC={$link}

which while good still leaves me a bit perplexed when it comes to why.

Above was done for purpose of testing limited change but I have also added the quotes you suggested and that seems to be no problem.  So, per your point is good.

Very grateful for your help.  Well done!

Tip
If you not really sure if you have the slash that separate the folder and name there or not..  you can use the "path append" operator ^
Code: [Select]
//instead of
@var $link = $linkpath + $linkname;
//you can use
@var $link = $linkpath ^ $linkname;

^ Will check if any of the side have a \ or /  if not, then it will add a \

Title: Re: Trying to write pretty simple scripts is turning out to be very exasperating!!!
Post by: ajax on July 09, 2018, 17:08:59
Good to know.  Will do!

I also discovered that another technique that works is the following:

MC.Utils.CreateLink ASADMIN LNKTYPE=1 LNKTRG="{$filepath}" LNKSRC="{$linkpath^$linkname}"

Again.  Thanks for helping.  Multi Commander is very impressive!