Is there a command to set a Windows service to "Automatic (Delayed Start)"?

I made an Elixir app with mix release that runs on Windows as a service.

Because of a erlsrv bug (Windows service fails to start on OS (re)boot · Issue #6076 · erlang/otp · GitHub), I manually set the service to “Automatic (Delayed Start)”.

I would like to automate this step with a command line that I could add in my installer (Inno Setup).

However, it seem that I need the true service name and not the display name to change the service to “Automatic (Delayed Start)”:

PS C:\WINDOWS\system32> sc.exe config "myapp_myapp" start=delayed-auto
[SC] OpenService FAILED 1060:

The specified service does not exist as an installed service.

PS C:\WINDOWS\system32> sc.exe config myapp01da552321887be0 start=delayed-auto
[SC] ChangeServiceConfig SUCCESS

I am not aware of the true service name when installing the service because it is generated randomly. However, there seems to be a way to get the (truncated) true service name from the display name:

PS C:\WINDOWS\system32> Get-Service -Displayname "myapp_myapp"

Status   Name               DisplayName
------   ----               -----------
Stopped  myapp01da552321... myapp_myapp

I am not so familiar with Windows scripting. Is there a way to run a command to change the service to “Automatic (Delayed Start)” with only the display name myapp_myapp as argument?

I remember I ran into the same issue way back when I built an Elixir app that had to run on Windows. I never automated it though. I added a manual step to the instructions for installing the app, and was content with the fact that you can set this configuration option once, and subsequent installations would keep this setting unchanged (at least, that’s what I remember).

Maybe you can parse the true service name from the output of the command you shared? Should be doable.

Just as an aside: I used these instructions to shorten the delay after which the service started. Two minutes (the default) was a bit too much for me.

Try piping that into select?

Get-Service -Displayname "myapp_myapp" | select -ExpandProperty Name -first 1

That works!

The full command I came up with:

for /f "usebackq" %s in (`powershell.exe -Command "Get-Service -Displayname myapp_myapp | Select -ExpandProperty Name -First 1"`) do sc.exe config %s start=delayed-auto

which translates to Inno Setup as:

Filename: "{app}\bin\myapp.bat"; Parameters: "install"
Filename: "{cmd}"; \
  Parameters: "/c ""for /f ""usebackq"" %s in (`powershell.exe -Command ""Get-Service -Displayname myapp_myapp | Select -ExpandProperty Name -First 1""`) do sc.exe config %s start=delayed-auto"""; \
  Flags: runhidden
1 Like