2017-10-05 12 views
0

私はPowerShellスクリプトをウィンドウで実行しています。 このウィンドウは、正確に何が実行されているかという情報をユーザーに提供するために必要です。スクリプトは単にIEが終了するのを待ちます。スクリプトが停止しないようにする方法

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

書かれていますが、このウィンドウを閉じないでください。 このループの後、スクリプトはいくつかのクリーンアップ作業を行う必要があるため、ユーザーがスクリプトを中断できる場合はあまりうれしくありません。 ユーザーがウィンドウを閉じてもクリーンアップがスクリプトによって実行されることを確認するにはどうすればよいですか?

+0

割り込みハンドリングは間違いなくあなたがだと思います – Clijsters

+0

あなたはスクリプトを最小限に抑えようと試みることができますが、ユーザーはまだ大混乱に陥るかもしれません。あなたが本当に必要とするのは、ユーザーのモチベーションを理解することです。 *なぜ*彼らは窓を閉めているのですか?動機づけを理解した後、解決策を見つけやすくなります。 – vonPryz

+0

関数の入力処理メソッド(Begin..Process..End)を見てください。リンク:https://ss64.com/ps/syntax-function-input.html最後の部分でクリーンアップを行うことができます – guiwhatsthat

答えて

1

実際にスクリプトを2に分解することができます。 実際の作業を行い、1人が表示を行います。

したがって、ユーザーが表示ウィンドウを閉じると、実際のスクリプトは開いたままになります。

例えば、取る:

  • ScriptThatWorkHard.ps1

  • ScriptThatDisplayThings.ps1

ScriptThatWorkHard.ps1 -WindowStyleHiddenがそう、それはすぐに存在から飛び出す使用打ち上げ。

ユーザーはそのウィンドウを閉じることができません。彼らは(あなたが最初のスクリプトが第二スクリプトに表示するコンテンツを送信する)通信するため

このスクリプトは、すぐに順番にScriptThatDisplayThings.ps1

を起動し、私はパイプのすべてのコンテンツによって生成う隠しスクリプトを2番目のスクリプトが監視するファイルにコピーします。

第2のスクリプトは、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)) 

スクリプトを終了する唯一の方法は、そう、ユーザによって行われ、タスクマネージャを介してです。

関連する問題