2017-10-05 173 views
0

我在窗口中運行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

回答

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

而且,你將不得不實現「讀取日誌文件新內容」部分。

然而,使用該方法的結果是非常清楚的。 如果生氣的用戶關閉窗口,他實際上關閉了信息窗口,而不是下面的運行腳本。

+0

在這種情況下,應該也可以重新打開關閉的顯示窗口。 –

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

終止腳本的唯一途徑就是通過這不太可能由用戶完成的任務管理器。