Run Windows CLI app with arguments from Mac via Parallels

I want to use InnoSetup to compile scripts under control of my Xojo Mac application.

When I invoke the app (even without arguments) using a Xojo Shell I get “permission denied”.

Argument, if I could get that far, would just be the path to my InnoSetup script file.

This https://apple.stackexchange.com/questions/271236/parallels-desktop-run-windows-application-with-command-line-arguments

implies that maybe it’s available in the Pro version of Parallels, but the Parallels website info is pretty sparse and I thought I’d check here first to see if anyone has relevant experience/advice.

I guess I could just build my Xojo app for Windows and run it under Parallels, but eww.

What I have historically done is use a macOS script to alter the InnoSetup file (*.iss) with the new version number and whatever I want to change. Then launch Parallels, open the VM, and run InnoSetup via the GUI, and all I have to do is click the Run icon.

But I do relatively few Windows releases, so it has never been a priority yet to automate more completely.

Thanks, Douglas. I do a lot of deployments so am making a tool to automate the whole process including uploading to update servers.

What I’ve found so far:

You do need the “Pro” or “Business” version of Parallels to send Windows commands. It’s $69/yr instead of $69 one time, so not too onerous.

You can then send windows shell commands from a Mac shell like this:

prlctl command <vm_ID | vm_name> [options] [-v, --verbose number]

e.g.

prlctl exec "Windows 11" "C:\Program Files (x86)\Inno Setup 6\ISCC.exe"

My problem now is passing the script file argument - InnoSetup launches but doesn’t like the path to the script file, which is on a mapped drive pointing to the Mac filesystem, i.e. sending

prlctl exec "Windows 11" "C:\Program Files (x86)\Inno Setup 6\ISCC.exe" "X:\MyStuff\Installer Script.iss"

Returns the InnoSetup greeting messages followed by “The system cannot find the path specified.” The path does work when I use the Windows cmd terminal.

I also tried making a batch file stored on a Windows drive. It works when double-clicked in the File Explorer but when invoked from the Mac Terminal using prlctl it sits for a while as if it’s running and no errors are reported, but after the command returns no output has been generated by InnoSetup.

Is the “sit for awhile” delay approximately the same as running the batch file from the VM? Maybe it is producing output but not in the location you expect? Try using the File Explorer ribbon search tab and set the Date Modified to today and let it recursively check each drive for files modified today. I do very little in Windows anymore, so I can’t be more specific than that. This may help:

how-to-search-for-files-from-a-certain-date-range-in-windows

If you’re hell bent on doing this on a Mac, I suggest trying Crossover.

1 Like

Thanks for reminding me, it’s been ages since I abandoned it for Parallels, maybe I’ll give it another go.

1 Like

Or even just Wine.

We used to use it for Innosetup installer building but moved on to Parallels once we started signing the app/installer. We have an internal Xojo app that builds the innosetup .iss files and uploads the results, etc so I hear what you’re wanting to do.

From what I’ve read, you can also do codesigning with Wine but we haven’t put the effort into solving it

It’s a journey rather than a destination, we seem to be tweaking and adding to it every 6 months or so. The automation is well worth the effort though. Many hours and many clicks saved!

good luck

Yeah, crossover can be a pain, but I find that parallels can be very picky at times when using prlctl.

As for parallels, I have had the best success making one-off calls. That is, if you need a bunch of calls in succession, make a windows .bat or powershell script to do that and use prlctl to execute it.

The other thing you could try is using a CI/ CD build system like Jenkins or GoCD and just set up your virtual machine as a builder. I use a Jenkins test VM in parallels pro at work for testing upgrades and new features by having it run headless in the background all the time. It consumes a tiny amount of CPU and memory when it’s not in use.

1 Like

The “solution” to the original question is that the prlctl command included with the Pro and Business versions of Parallels can be used to send shell commands with arguments to a Windows VM.

My ugly workaround to InnoSetup’s non-acceptance of network (Mac) drive paths passed by this method is to temporarily copy all needed files to the Windows VM where InnoSetup accepts the paths passed via prlctl. This maintains backward compatibility with all my existing scripts, folder structures, and my old manual workflow.

2 Likes