13

これは可能ですか?私はついに、個人の.NET開発環境のセットアップを開始して、* NIX開発環境のセットアップ方法をより厳密に模倣することにしました。これは、Powershellを本格的に学習することを意味します。

私は現在、ファイルシステムを介して再帰する関数を作成しており、物事を構築するために作業ディレクトリを設定しています。私が気になる小さなことの1つは、関数をCtrl + Cで外すと、スクリプトが最後にあった場所に移動してしまうことです。trap実行時にディレクトリを開始点に変更するブロックを設定しようとしましたが、これは例外でのみ意図されている(そして起動されている)ようです。

これがUnixにルートを持つ言語の場合、のシグナルハンドラーを設定しましたSIGINTが、Powershellで同様の検索を見つけることができません。.NETキャップを付けると、ハンドラーをアタッチできるある種のイベントがあると想像しています。推測しなければならない場合、それはのイベントになりますが$host、の正規のドキュメントが見つかりませんSystem.Management.Automation.Internal.Host.InternalHostUserInterface。そして、私が検索することができた逸話は何も役に立ちませんでした。

おそらく私は完全に明白な何かを見逃していますか?

4

2 に答える 2

21

このような意味ですか?

try
{
    Push-Location
    Set-Location "blah"
    # Do some stuff here
}

finally
{
    Pop-Location
}

こちらのドキュメントを参照してください特にその段落:「Finallyブロックステートメントは、Tryブロックで終了エラーが発生したかどうかに関係なく実行されます。WindowsPowerShellは、スクリプトが終了する前、または現在のブロックがスコープ外になる前に、Finallyブロックを実行します。CTRLを使用しても、Finallyブロックは実行されます。 + Cでスクリプトを停止します。ExitキーワードがCatchブロック内からスクリプトを停止した場合も、Finallyブロックが実行されます。 "

于 2012-04-16T18:55:56.170 に答える
6

これは、コンソール kepboard 入力を処理します。コントロール C がループ中に押された場合、イベントを処理する機会が得られます。サンプル コードでは、警告が出力され、ループが終了します。

[console]::TreatControlCAsInput = $true
dir -Recurse -Path C:\ | % {
    # Process file system object here...
    Write-Host $_.FullName

    # Check if ctrl+C was pressed and quit if so.
    if ([console]::KeyAvailable) {
        $key = [system.console]::readkey($true)
        if (($key.modifiers -band [consolemodifiers]"control") -and ($key.key -eq "C")) {
            Write-Warning "Quitting, user pressed control C..."
            break
        }
    }
于 2012-04-16T19:11:06.830 に答える