public object GetVariableValue(string guid, string variableName) { if (!IsLoggedInUserAuthorized) { return(string.Empty); } var sessionExists = ScriptSessionManager.SessionExists(guid); if (!sessionExists) { return("<div class='undefinedVariableType'>Session not found</div>" + "<div class='variableLine'>A script needs to be executed in the session<br/>before the variable value can be inspected.</div>"); } var session = ScriptSessionManager.GetSession(guid); try { variableName = variableName.TrimStart('$'); var debugVariable = session.GetDebugVariable(variableName); if (debugVariable == null) { return("<div class='undefinedVariableType'>undefined</div>" + $"<div class='variableLine'><span class='varName'>${variableName}</span> : <span class='varValue'>$null</span></div>"); } var defaultProps = new string[0]; if (debugVariable is PSObject) { var script = $"${variableName}.PSStandardMembers.DefaultDisplayPropertySet.ReferencedPropertyNames"; session.Output.SilenceOutput = true; try { if (session.TryInvokeInRunningSession(script, out List <object> results) && results != null) { defaultProps = session.IsRunning ? (session.Output.SilencedOutput?.ToString() .Split('\n') .Select(line => line.Trim()) .ToArray() ?? new string[0]) : results.Cast <string>().ToArray(); session.Output.SilencedOutput?.Clear(); } } finally { session.Output.SilenceOutput = false; } } var variable = debugVariable.BaseObject(); if (variable is PSCustomObject) { variable = debugVariable; } var details = new VariableDetails("$" + variableName, variable); var varValue = $"<div class='variableType'>{variable.GetType().FullName}</div>"; varValue += $"<div class='variableLine'><span class='varName'>${variableName}</span> : <span class='varValue'>{details.HtmlEncodedValueString}</span></div>"; if (!details.IsExpandable) { return(varValue); } // sort only if the object is not an array otherwise the indexes will get scrambled. var children = details.ShowDotNetProperties ? details.GetChildren().OrderBy(d => d.Name).ToArray() : details.GetChildren(); foreach (var child in children) { if (!child.IsExpandable || defaultProps.Contains(child.Name, StringComparer.OrdinalIgnoreCase) || ImportantProperties.Contains(child.Name, StringComparer.OrdinalIgnoreCase)) { varValue += $"<span class='varChild'><span class='childName'>{child.Name}</span> : <span class='childValue'>{child.HtmlEncodedValueString}</span></span>"; } else { if (details.ShowDotNetProperties) { continue; } varValue += $"<span class='varChild'><span class='childName'>{child.Name}</span> : <span class='childValue'>{{"; foreach (var subChild in child.GetChildren()) { if (!subChild.IsExpandable) { varValue += $"<span class='childName'>{subChild.Name}</span> : {subChild.HtmlEncodedValueString}, "; } } varValue = varValue.TrimEnd(' ', ','); varValue += "}</span></span>"; } } if (details.MaxArrayParseSizeExceeded) { varValue += $"<span class='varChild'><span class='varName'>... first {VariableDetails.MaxArrayParseSize} items shown.</span></span>"; } return(varValue); } catch (Exception ex) { return(ex.Message); } }
public object GetVariableValue(string guid, string variableName) { var sessionExists = ScriptSessionManager.SessionExists(guid); if (sessionExists) { var session = ScriptSessionManager.GetSession(guid); try { variableName = variableName.TrimStart('$'); var debugVariable = session.GetDebugVariable(variableName); if (debugVariable == null) { return($"<div class='undefinedVariableType'>undefined</div>" + $"<div class='variableLine'><span class='varName'>${variableName}</span> : <span class='varValue'>$null</span></div>"); } var defaultProps = new List <string>(); if (debugVariable is PSObject && !session.IsRunning) { var script = $"${variableName}.PSStandardMembers.DefaultDisplayPropertySet.ReferencedPropertyNames"; List <object> results; if (session.TryInvokeInRunningSession(script, out results) && results != null) { defaultProps = results.Cast <string>().ToList(); } } var variable = debugVariable.BaseObject(); if (variable is PSCustomObject) { variable = debugVariable; } VariableDetails details = new VariableDetails("$" + variableName, variable); var varValue = $"<div class='variableType'>{variable.GetType().FullName}</div>"; varValue += $"<div class='variableLine'><span class='varName'>${variableName}</span> : <span class='varValue'>{details.HtmlEncodedValueString}</span></div>"; if (details.IsExpandable) { foreach (var child in details.GetChildren().OrderBy(d => d.Name)) { if (!child.IsExpandable || defaultProps.Contains(child.Name, StringComparer.OrdinalIgnoreCase) || ImportantProperties.Contains(child.Name, StringComparer.OrdinalIgnoreCase)) { varValue += $"<span class='varChild'><span class='childName'>{child.Name}</span> : <span class='childValue'>{child.HtmlEncodedValueString}</span></span>"; } else { if (details.ShowDotNetProperties) { continue; } varValue += $"<span class='varChild'><span class='childName'>{child.Name}</span> : <span class='childValue'>{{"; foreach (var subChild in child.GetChildren()) { if (!subChild.IsExpandable) { varValue += $"<span class='childName'>{subChild.Name}</span> : {subChild.HtmlEncodedValueString}, "; } } varValue = varValue.TrimEnd(' ', ','); varValue += "}</span></span>"; } } } //var varValue = variable + " - "+ variable.GetType(); return(varValue); } catch (Exception ex) { return(ex.Message); } } return($"<div class='undefinedVariableType'>Session not found</div>" + $"<div class='variableLine'>A script needs to be executed in the session<br/>before the variable value can be inspected.</div>"); }