LoginSignup
16
10

More than 5 years have passed since last update.

PowerShell で Ctrl+C で終了する時に任意の処理をしたい

Posted at

結論

処理を Try で囲み、Finally に終了する時の処理を書くと出来た
以下に PowerShell だけでなく、様々なプログラミング言語などでのシグナルハンドルの例があった

Handle a signal - Rosetta Code

環境

PS C:\Windows\system32> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.14393.2395
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.14393.2395
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

やってみた

以下を参考にファイルを作ってみた

powerShellで無限ループと待機処理

try
{
  while(1){
    Write-Output ('hi')
  }
}
finally
{
  Write-Output ('exit')
}

しかしながら、これだとCTRL+Cで終了した時に「exit」が表示されない
ただし、以下だとうまくいく

Handle a signal - Rosetta Code

$Start_Time = (Get-date).second
Write-Host "Type CTRL-C to Terminate..."
$n = 1
Try
{
    While($true)
    {
        Write-Host $n
        $n ++
        Start-Sleep -m 500
    }
}
Finally
{
    $End_Time = (Get-date).second
    $Time_Diff = $End_Time - $Start_Time
    Write-Host "Total time in seconds"$Time_Diff
}

やってみる。

PS C:\Users\Administrator> .\mugen.ps1
Type CTRL-C to Terminate...
1
2
3
Total time in seconds 2

うまくいった。

よく見るとWrite-OutputWrite-Hostという点が違う。
試しにWrite-Outputに変えてみたら「Total time in seconds 2」が表示されなくなった。

Write-HostとWrite-Outputの違い

Write-Hostの方が直接的にはコンソール出力だから適切ということなのだろうか。
この辺りもし知見のある方など居ましたら教えて頂けますと幸いです。。。

16
10
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
10