如何防止脚本被停止

时间:2017-10-05 09:56:44

标签: powershell

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

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

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

2 个答案:

答案 0 :(得分:1)

您实际上可以将脚本分解为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”)

此外,您还必须实现“读取日志文件新内容”部分。

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

答案 1 :(得分: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))

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