3

特定のディレクトリでのファイル作成を監視するスクリプトがあります。System.IO.FileSystemWatcherを作成した後、Register-ObjectEventを使用しています。

うまく機能しますが、-Actionコードブロックにブレークポイントを設定すると、IDEは次のように生成します。

警告:「D:\ MyStuff \ Desktop \ scripts \ fileWatcher.ps1:15」のブレークポイントラインブレークポイントはヒットしません

このメッセージは、監視しているディレクトリにファイルをドロップした直後に発生し、上記の「警告」の直後にWrite-Hostがメッセージを出力しているのを確認できます。

これは正常ですか?
さらにコードを追加する必要があり、実際にデバッガーを使用できます。このコードブロックをデバッグできるようにするにはどうすればよいですか?

$fsw = [System.IO.FileSystemWatcher] $path

Register-ObjectEvent -InputObject $fsw –EventName Created -SourceIdentifier DDFileCreated -Action { 
    $name = $Event.SourceEventArgs.Name 
    $changeType = $Event.SourceEventArgs.ChangeType 
    $timeStamp = $Event.TimeGenerated 
    Write-Host "The file '$name' was $changeType at $timeStamp" -fore green 
    Out-File -FilePath $logFile -Append -InputObject "The file '$name' was $changeType at $timeStamp"
} 
4

1 に答える 1

3

同じ ISE またはコンソール セッションで直接 powershell コマンドからイベントをトリガーすると、実際には機能します。

$path = (Resolve-Path '~\').Path
if(Test-Path "$path\newfile.txt"){ del "$path\newfile.txt" }

$fsw = [System.IO.FileSystemWatcher] $path

Register-ObjectEvent -InputObject $fsw –EventName Created -SourceIdentifier DDFileCreated -Action { 
    $name = $Event.SourceEventArgs.Name  # put breakpoint here, via ISE or script
    $changeType = $Event.SourceEventArgs.ChangeType 
    $timeStamp = $Event.TimeGenerated 
    Write-Host "The file '$name' was $changeType at $timeStamp" -fore green 
}

'foo' | out-file "$path\newfile.txt"   # breakpoint hit

しかし、単純にイベントをフックして、何らかの外部プロセスがファイルを作成するのを待つと、問題が発生していることがわかります。

したがって、イベントを直接トリガーするテスト コードを追加できる場合は、それを使用してください。

そうでない場合は、読み進めてください...

シェルまたは ISE が新しいコマンドを待機している間はデバッガに入ることができないようです。別のコマンドの実行中にのみ入ることができます。

その理論に沿って、これが回避策です(私にとってはうまくいきます):

  1. ブレークポイントを設定する
  2. イベント サブスクリプション コードを実行する
  3. ISE コンソール ウィンドウでコマンド「Read-Host」を実行するか、シェルのプロンプトから実行します。
  4. 外部プロセスが原因でイベントが発生するはずであることがわかるまで待ちます
  5. 「Enter」キーを押して Read-Host を完了させます

ビオラ、ブレイクポイントヒット!

于 2012-08-15T19:42:23.963 に答える