JosefNemec/Playnite · error · Exception
Interactive session is already running
Error message
Interactive session is already running
What it means
Thrown by PowerShellRuntime.StartInteractiveSession when a previous interactive PowerShell session (interactiveRuntime) is still alive. Playnite supports only one attached interactive PS host at a time because it shares a single runspace ('PSInteractive') with the host process, so a second start is refused.
Source
Thrown at source/Playnite/Scripting/PowerShell/PowerShell.cs:130
powershell = System.Management.Automation.PowerShell.Create(initialSessionState);
runspace = powershell.Runspace;
runspace.Name = runspaceName;
SetVariable("ErrorActionPreference", "Stop");
SetVariable("__logger", LogManager.GetLogger(runspaceName));
}
public void Dispose()
{
IsDisposed = true;
runspace.Close();
runspace.Dispose();
}
public static void StartInteractiveSession(Dictionary<string, object> variables = null)
{
if (interactiveRuntime != null)
{
throw new Exception("Interactive session is already running");
}
interactiveRuntime = new PowerShellRuntime("PSInteractive");
variables?.ForEach(a => interactiveRuntime.SetVariable(a.Key, a.Value));
interactiveProcess = new Process();
interactiveProcess.StartInfo.FileName = @"c:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe";
// This is really sad solution, but there's currently no way how to initialize these variables automatically, because:
// - Enter-PSHostProcess is blocking so we can't pass any command after it
// - We can't redirect stdin because then user wouldn't be able to interact witht the console
// - Messages like WM_PASTE don't work on PowerShell console
// - Passing CTLR-V and ENTER is not possible, because the only reliable method works globaly and can't be sent directly to window handle
interactiveProcess.StartInfo.Arguments = $"-NoExit -Command \"" +
$"Write-Host \"`n" +
$"`tConnected to Playnite process.`n" +
$"`tUse CTLR-V and ENTER to paste commands to initialize basic SDK variables.`n" +
$"`tMore information at:`n" +
$"`thttps://playnite.link/docs/master/tutorials/extensions/scriptingDebugging.html`n" +
View on GitHub (pinned to 5911f4e964)
Solutions
- Close the existing interactive PowerShell window (type 'exit' or close it) so the Exited handler disposes interactiveRuntime.
- If the field is stuck non-null after a crash, restart Playnite to reset static state.
- Before calling StartInteractiveSession again, confirm interactiveRuntime is null / IsDisposed.
- Avoid issuing multiple Open Interactive Session commands in rapid succession.
Example fix
// before PowerShellRuntime.StartInteractiveSession(vars); PowerShellRuntime.StartInteractiveSession(vars); // throws // after PowerShellRuntime.StartInteractiveSession(vars); // ... user works, closes the window, Exited handler nulls interactiveRuntime ... PowerShellRuntime.StartInteractiveSession(vars); // ok
Defensive patterns
Strategy: validation
Validate before calling
// No public getter is exposed; track liveness at the call site before starting:
// (reflective/field check is internal — callers should keep a single owner of StartInteractiveSession)
if (interactiveSessionStarted) { /* inform user a session is already running */ return; }
PowerShellRuntime.StartInteractiveSession(vars);
interactiveSessionStarted = true; Type guard
// Not externally type-guardable; guard at the command/UI layer: bool CanStartInteractiveSession() => !interactiveSessionStarted;
Try / catch
try { PowerShellRuntime.StartInteractiveSession(vars); }
catch (Exception ex) when (ex.Message.Contains("already running")) { /* tell user to close the existing window */ } Prevention
- Bind the 'Open Interactive Session' command's CanExecute to a flag tracking whether one is running.
- Always close the prior window before starting a new one.
- On app shutdown, dispose the interactive runtime to reset static state.
When it happens
Trigger: StartInteractiveSession is invoked while interactiveRuntime != null (line 128). The previous process may still be running because its Exited handler only nulls interactiveRuntime after the powershell.exe process exits.
Common situations: User opened the interactive PowerShell debug session, then triggered Open Interactive Session again without closing the first. The previous powershell.exe window was closed via the X button but the process hadn't fully terminated and fired Exited yet. A crashed earlier session left interactiveRuntime non-null.
Related errors
- Cannot load script file, uknown format.
- PowerShell 5.1 is not installed.
- e.Message
- LOC.ErrorPowerShellNotInstalled
- Cannot execute script, no runtime given.
AI-assisted analysis of JosefNemec/Playnite@5911f4e964 (2026-08-13).
Data as JSON: /api/errors/8bad338ceca06798.
Report an issue: GitHub.