我在窗口中运行PowerShell脚本。 该窗口是必要的,因为它向用户提供正在运行的信息。脚本只是等待IE终止。
while ( $ieProc.Responding) {
$Message = "Running " + $script + ":" + $script[$nr] + " please do not close this window !!!"
write $Message
sleep 5
}
写的,请不要关闭此窗口,但有些用户会这样做! 因为在这个while循环之后脚本必须做一些清理工作,如果用户可以中断脚本,我不是很高兴。 即使用户关闭窗口,如何确保脚本执行清理?
答案 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))
终止脚本的唯一方法是通过任务管理器,用户不太可能这样做。