如何防止脚本停止

问题描述:

我在窗口中运行PowerShell脚本。 该窗口是必要的,因为它向用户提供信息究竟在运行什么。该脚本只是等待IE终止。如何防止脚本停止

while ($ieProc.Responding) { 
$Message = "Running " + $script + ":" + $script[$nr] + " please do not close this window !!!" 
write $Message 
sleep 5 
} 

这是写的,请不要关闭这个窗口,但一些用户呢! 由于在while循环之后脚本必须做一些清理工作,如果用户可以中断脚本,我不会很高兴。 即使用户关闭窗口,我如何确保脚本执行清除操作?

+0

中断处理绝对不是你想象的那样 – Clijsters

+0

你可以尝试运行脚本最小化,但用户仍可能破坏浩浩荡荡。你真正需要做的是了解用户的动机。 *为什么*他们正在关闭窗户?在找出动机后,解决方案更容易找到答案。 – vonPryz

+0

查看函数输入处理方法(Begin..Process..End)链接:https://ss64.com/ps/syntax-function-input.html您可以在结束部分完成清理工作 – guiwhatsthat

你实际上可以将你的脚本分解为2个。 一个会做实际的工作,一个会做显示。

因此,如果用户关闭显示窗口,实际的脚本将保持打开状态。

例如,采取:

  • ScriptThatWorkHard.ps1

  • ScriptThatDisplayThings.ps1

ScriptThatWorkHard.ps1推出使用-WindowStyleHidden所以蹦出存在的马上。

用户将无法关闭该窗口。

该脚本,立即启动ScriptThatDisplayThings.ps1

为了他们沟通(您想第一个脚本来发送,以显示到第二个脚本内容),我会管的所有内容所产生将隐藏的脚本放入第二个脚本将监视的文件中。

通过监视LastWriteTime,第二个脚本可以检测对文件所做的更改并显示其内容。

有点简单,但这里的第二脚本可以是什么样子: (除非你真正的脚本,而不是“datelimit”退出脚本,你应该用户的一些其他方法)

if (Test-Path $logFullPath) { 
$LastModifiedTime = (Get-ChildItem -Path $logFullPath).LastWriteTime 
$DateLimit = (Get-Date).AddSeconds(10) 

     While ((Get-date) -le $DateLimit) { 
     $NewLastModifiedDate = (Get-ChildItem -Path $logFullPath).LastWriteTime 
     if ($LastModifiedTime -ne $NewLastModifiedDate) { 
      $LastModifiedTime = $NewLastModifiedDate 
      $DateLimit = (Get-Date).AddSeconds(10) 
      Write-Host 'The unread lines from your logfile' 
     } 
    } 
} 

这绝不是一个完整的例子,而是一个开始。

举例来说,你可以检测和使用专线在日志传递命令到您的显示脚本(如关机,所以它知道何时关闭,而不是一个“datelimit”)

而且,你将不得不实现“读取日志文件新内容”部分。

然而,使用该方法的结果是非常清楚的。 如果生气的用户关闭窗口,他实际上关闭了信息窗口,而不是下面的运行脚本。

+0

在这种情况下,应该也可以重新打开关闭的显示窗口。 –

你可能会考虑完全隐藏你的PowerShell窗口如下:

$Win32 = Add-Type -MemberDefinition ' 
    [DllImport("user32.dll")]public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); 
' -Name "Win32Functions" -NameSpace Win32Functions -PassThru 
[Void]($Win32::ShowWindowAsync((Get-Process -id $pid).MainWindowHandle, 0)) 

终止脚本的唯一途径就是通过这不太可能由用户完成的任务管理器。