As you all know, scheduled publishing will not run automatically unless you enable PublishAgent task in Sitecore config.
By default, all items that are in publish queue will get published when this task triggers. This includes all items in the final workflow state and all items that don't have workflows. Sometimes this is not what you want. Maybe you don't enable workflow on media items and you don't want the items to go live when they are not ready.
The workaround is to create your own PublishAgent task. Looking at the one provided, we can easily extend the code to insert the RootItem to the PublishOptions (this only works with Full or Smart publish mode however):
You will notice that on the Run method I check whether the server time is around the time I set in the parameter (thanks to this post for the code). This will enable us to run the task near the specific time we set (e.g. midnight).
In the config patch, just add this to enable the custom agent:
There you go. You can monitor your Publishing log file to see if the task is properly triggered. Don't forget to disable the task in the SwitchMasterToWeb config as well.