Jump to content

$CmdLine parameters


prizm1
 Share

Recommended Posts

I am trying to pass multi-file selections from Windows Explorer into the $CmdLine argument parameters array. For example, and these are not the literal program/project names, I can pass three full path file names via both Window's Run dialog and Terminal into the $CmdLine array, i.e, "c:\Dir\Program.exe" "D:\Test\file1.txt" "D:\Test\file2.txt" "D:\Test\file3.txt". When checked in the running program, $CmdLine index [1] has the correct value of 3, index [1] is correct with "D:\Test\file1.txt", index [2] with "D:\Test\file2.txt" and index [3] with "D:\Test\file3.txt". I get the same correct results in $CmdLine array when I start Program.exe with the same three file parameters using the Windows Terminal.

Also, I have added a HKEY_CLASSES_ROOT\*\shell\command key to the Window's registry. The registry entry is with a "C:\Program.exe" "%1" "$2" "%3" string value to allow for renaming file(s) from Windows Explorer via the right-click menu. With just one parameter placeholder, "%1" in the string value, a selected file will appear in $CmdLine. $CmdLine[0] is 1 and $Cmdline[1] contains the selected full path file name. Unfortunately, when I change the registry string value to include two more passing arguments, "%2" "%3", $CmdLine[0] =3 (as it should since three file path names are passed to Program.exe), $CmdLine[1] contains "D:\Test\file1.txt", but $CmdLine[2] and [3] are just empty strings.

It appears to me that Windows is not passing the second and third ("%2" and "%3") selected file's to Autoit, but just the first parameter "%1".

Is there some way that I can select more than one file in Window's Explorer and pass the full file paths into the $CmdLine array?

I know that AutoIt has the _WinAPI_GetOpenFileName function, but I would like to select files directly from Windows Explorer to bring into $CmdLine.

File Renaming Application 1.4.0.3.au3 Reg Key.reg

Edited by prizm1
Link to comment
Share on other sites

Hey,

Until someone comes up with a real solution, as a workaround what if you just pass one parameter %1 which holds all files with a placeholder char in between file names? Something you wouldn't expect (not allowed) in a filename and would be ok to pass. Then stringsplit and use as you wish.

 

Link to comment
Share on other sites

1 hour ago, GokAy said:

Until someone comes up with a real solution, as a workaround what if you just pass one parameter %1 which holds all files with a placeholder char in between file names? 

He’s not doing the passing - he wants to multi-select a bunch of files in windows explorer and have it run his program with the selected files as arguments, but apparently he’s only seeing the first one.

Code hard, but don’t hard code...

Link to comment
Share on other sites

Just place your app or shortcut to your app into %AppData%\Microsoft\Windows\SendTo

Right click file(s) and SendTo app

Example compile the following to SendTo path as CmdLines.exe

Right click file(s) » Send to » CmdLines.exe, it should display a list of all the files.

#include <Array.au3>
_ArrayDisplay($CmdLine)

 

Link to comment
Share on other sites

1 hour ago, Subz said:

Just place your app or shortcut to your app into %AppData%\Microsoft\Windows\SendTo

Right click file(s) and SendTo app

Example compile the following to SendTo path as CmdLines.exe

Right click file(s) » Send to » CmdLines.exe, it should display a list of all the files.

#include <Array.au3>
_ArrayDisplay($CmdLine)

 

Interesting as a work-around, Subz. Thanks. All three files in my test run seems to make it to $CmdLine via the SendTo approach. I don't know why the Window's registry approach passes only the first placeholder file path argument although $CmdLine[3] contains the correct number of placeholder arguments passed. I can run the identical string arguments via Window's Terminal and the Run command app with success. There must be some additional registry syntax required in addition to simply listing the placeholders after the compiled executable, ex., "C:\Dir\Program.exe" "%1" "%2" "%3". I would prefer the registry approach, though, if I could find a solution. It is a cleaner looking end-user approach to using the program.

Link to comment
Share on other sites

Maybe these will help then?

https://stackoverflow.com/questions/8635845/passing-multiple-parameters-through-registry

https://stackoverflow.com/questions/1826791/how-to-pass-in-multiple-file-folder-paths-via-a-right-click-event-verb-to-an-e

Same problem as yours, and only workaround seems like SubZ provided (32767 character command line limit). The real answer is writing a Shell Extension.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...