Skip to content

Commit 45bec5d

Browse files
Revert to a simplified scriptblock
Had to revert to scriptblock, due to interrupt handling being inconsistent with direct invocation. New implementation avoids leaking variables still.
1 parent b6f6c6c commit 45bec5d

4 files changed

Lines changed: 40 additions & 23 deletions

File tree

PSFramework/bin/PSFramework.dll

512 Bytes
Binary file not shown.

PSFramework/bin/PSFramework.pdb

0 Bytes
Binary file not shown.

PSFramework/bin/PSFramework.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,11 @@
354354
Error message to post when execution fails
355355
</summary>
356356
</member>
357+
<member name="F:PSFramework.Commands.InvokePSFProtectedCommand._ErrorScript">
358+
<summary>
359+
script used to write horrible errors on screen
360+
</summary>
361+
</member>
357362
<member name="M:PSFramework.Commands.InvokePSFProtectedCommand.BeginProcessing">
358363
<summary>
359364
Prepare runtime information, such as calling command or cmdlet object

library/PSFramework/Commands/InvokePSFProtectedCommand.cs

Lines changed: 35 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,18 @@ private string _ErrorMessage
160160
return Localization.LocalizationHost.Read("PSFramework", "FlowControl.Invoke-PSFProtectedCommand.Failed", new object[] { _Message });
161161
}
162162
}
163-
#endregion Private Fields
163+
164+
/// <summary>
165+
/// script used to write horrible errors on screen
166+
/// </summary>
167+
private string _ErrorScript = @"
168+
param (
169+
$__PSFramework__Parameters
170+
)
171+
Stop-PSFFunction @__PSFramework__Parameters
172+
return
173+
";
174+
#endregion Private Fields
164175

165176
#region Cmdlet Implementation
166177
/// <summary>
@@ -243,7 +254,7 @@ protected override void ProcessRecord()
243254
Thread.Sleep(nextWait);
244255
nextWait = (int)((double)nextWait * RetryWaitEscalation);
245256
}
246-
257+
247258
}
248259
#endregion Cmdlet Implementation
249260

@@ -267,30 +278,30 @@ private void Terminate(Exception error)
267278
)
268279
);
269280
}
270-
281+
271282
if (Continue)
272283
DoContinue(ContinueLabel);
273284
return;
274285
}
275286

276-
using (PowerShell ps = PowerShell.Create(RunspaceMode.CurrentRunspace))
277-
{
278-
ps.AddCommand("PSFramework\\Stop-PSFFunction")
279-
.AddParameter("Message", _ErrorMessage)
280-
.AddParameter("Exception", error)
281-
.AddParameter("Target", Target)
282-
.AddParameter("Continue", Continue)
283-
.AddParameter("FunctionName", _Caller.CallerFunction)
284-
.AddParameter("ModuleName", _Caller.CallerModule)
285-
.AddParameter("File", _Caller.CallerFile)
286-
.AddParameter("Line", _Caller.CallerLine)
287-
.AddParameter("Cmdlet", PSCmdlet)
288-
.AddParameter("EnableException", EnableException);
289-
if (!String.IsNullOrEmpty(ContinueLabel))
290-
ps.AddParameter("ContinueLabel", ContinueLabel);
291-
292-
ps.Invoke();
293-
}
287+
Hashtable parameters = new Hashtable(StringComparer.OrdinalIgnoreCase);
288+
parameters["Message"] = _ErrorMessage;
289+
parameters["Exception"] = error;
290+
parameters["Target"] = Target;
291+
parameters["Continue"] = Continue;
292+
if (!String.IsNullOrEmpty(ContinueLabel))
293+
parameters["ContinueLabel"] = ContinueLabel;
294+
parameters["FunctionName"] = _Caller.CallerFunction;
295+
parameters["ModuleName"] = _Caller.CallerModule;
296+
parameters["File"] = _Caller.CallerFile;
297+
parameters["Line"] = _Caller.CallerLine;
298+
parameters["Cmdlet"] = PSCmdlet;
299+
parameters["EnableException"] = EnableException;
300+
parameters["StepsUpward"] = 1;
301+
302+
ScriptBlock errorBlock = ScriptBlock.Create(_ErrorScript);
303+
object[] arguments = new object[] { parameters };
304+
PSCmdlet.InvokeCommand.InvokeScript(false, errorBlock, null, arguments);
294305
}
295306

296307
private void ErrorEventAction(Exception error)
@@ -301,7 +312,8 @@ private void ErrorEventAction(Exception error)
301312
object errorRecord = error;
302313
if (error is RuntimeException)
303314
errorRecord = ((RuntimeException)error).ErrorRecord;
304-
try {
315+
try
316+
{
305317
WriteMessage(Localization.LocalizationHost.Read("PSFramework.FlowControl.Invoke-PSFProtectedCommand.ErrorEvent", new object[] { _Message, Target }), Level, _Caller.CallerFunction, _Caller.CallerModule, _Caller.CallerFile, _Caller.CallerLine, Tag, Target);
306318
table["Result"] = PSCmdlet.InvokeCommand.InvokeScript(false, ErrorEvent, null, errorRecord);
307319
WriteMessage(Localization.LocalizationHost.Read("PSFramework.FlowControl.Invoke-PSFProtectedCommand.ErrorEvent.Success", new object[] { _Message, Target }), Level, _Caller.CallerFunction, _Caller.CallerModule, _Caller.CallerFile, _Caller.CallerLine, Tag, Target, table);
@@ -313,4 +325,4 @@ private void ErrorEventAction(Exception error)
313325
}
314326
}
315327
}
316-
}
328+
}

0 commit comments

Comments
 (0)