Powershell 如何防止脚本停止

Powershell 如何防止脚本停止,powershell,Powershell,我在窗口中运行了一个PowerShell脚本。 该窗口是必要的,因为它向用户提供了确切运行的信息。脚本只是等待IE终止 while ( $ieProc.Responding) { $Message = "Running " + $script + ":" + $script[$nr] + " please do not close this window !!!" write $Message sleep 5 } 这是写的,请不要关闭这个窗口,但有些用户会这样做!!! 因为在这个while循环

我在窗口中运行了一个PowerShell脚本。 该窗口是必要的,因为它向用户提供了确切运行的信息。脚本只是等待IE终止

while ( $ieProc.Responding) {
$Message = "Running " + $script + ":" + $script[$nr] + " please do not close this window !!!"
write $Message
sleep 5
}
这是写的,请不要关闭这个窗口,但有些用户会这样做!!! 因为在这个while循环之后,脚本必须做一些清理工作,如果用户可以中断脚本,我会很不高兴。
如何确保即使用户关闭窗口,也由脚本执行清理?

您实际上可以将脚本分解为2个部分。 一个做实际工作,一个做展示

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

例如:

ScriptThatWorkHard.ps1

ScriptThatDisplayThings.ps1

ScriptThatWorkHard.ps1使用-WindowStyleHidden启动,以便它立即弹出

用户将无法关闭该窗口

该脚本,立即启动ScriptThDisplayThings.ps1

为了让他们交流您希望第一个脚本将要显示的内容发送给第二个脚本,我将通过管道将隐藏脚本生成的所有内容传输到第二个脚本将监视的文件中

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

有点简单,但第二个脚本可能是这样的: 除了在真实脚本中,您应该使用其他方法,而不是使用日期限制退出脚本

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'
       }
    }
}
这绝不是一个完整的例子,而是一个开始

例如,您可以检测并使用日志中的特殊行将命令传递给显示脚本(如shutdown),以便它知道何时关闭而不是日期限制

此外,还必须实现读取日志文件的新内容部分

然而,使用这种方法的结果是相当清楚的。
如果恼怒的用户关闭窗口,他实际上是在关闭信息窗口,而不是下面正在运行的脚本

> P>您可以考虑完全隐藏您的PopS壳窗口如下:

$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))

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

中断处理肯定不是您所认为的。您可以尝试将脚本运行到最低限度,但用户仍可能造成严重破坏。你真正需要做的是了解用户的动机。他们为什么要关窗户?找出动机之后,解决方案就更容易找到了。看看函数输入处理方法Begin..Process..End链接:你可以在末尾部分完成清理部分请参阅我的答案。您必须修改它以满足您的需要,但如果您隐藏脚本窗口并启动第二个脚本(用于显示第一个脚本的内容输出),则可以这样做。用户关闭窗口不会影响执行工作的脚本,只会影响信息的显示。在这种情况下,还可以重新打开关闭的显示窗口。