# encoding: ascii
# api: powershell
# title: Stop-Pipeline
# description: Use this to stop scripts running in PowerShell.exe in mid-stride.
# version: 0.1
# type: script
# author: Joel Bennett
# license: CC0
# x-poshcode-id: 1582
# x-archived: 2014-05-25T04:10:54
# x-published: 2010-01-16T11:35:00
#
#
$Wasp = Add-Type -MemberDefinition @'
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetForegroundWindow(IntPtr hWnd);
'@ -Passthru
$null = Add-Type -Assembly System.Windows.Forms
filter Stop-Pipeline( [scriptblock]$condition = {$true} ) {
if (& $condition) {
## You need to make sure PowerShell is the foreground Window before you send Ctrl+C
if($Wasp::SetForegroundWindow( (Get-Process -id $PID).MainWindowHandle )) {
[System.Windows.Forms.SendKeys]::SendWait("^C")
} else {
Throw (New-Object System.Management.Automation.PipelineStoppedException)
}
$condition = { $true } ## Make sure that once it's true, it's always true
} else { ## Sometimes, the commands upstream manage to send out extras
$_
}
}