Вопрос по filesystemwatcher, .net, powershell – FileSystemWatcher для выполнения функций .NET

1

Я создаю быстрое временное исправление, так что извините, если это грязно, но ...

Задача

Я хотел бы использовать командлет Powershells Register-Event, чтобы дождаться, когда файл будет помещен в папку, а затем вызвать функцию, которая анализирует файл и выводит его в Excel. Я неМне нужна помощь с аспектом кодирования, просто концепция. Для меня все еще немного загадочно то, где проходит это событие и с какими ресурсами оно должно работать.

Вещи, которые яve пробовал

Один файл .ps1 с зарегистрированными событиями внизу, вызывающий функцию вверху, вызываемую пакетным файлом.

Поведение: Остановки на этой линии:

$sr = new-object System.IO.StreamReader($copyPath)

Это мой первый вызов .NET, поэтому я предположил, что это проблема с .NET.

Два файла .ps1, FileWatcher и Parser, оба прекрасно работают при отдельном запуске, вызываемом пакетным файлом.

Поведение: FileWatcher Outputs "Эта линия " но не может вывести какие-либо строки в Parser и никогда не попадает в эту строку.

Register-ObjectEvent $fsw Changed -SourceIdentifier FileChange -Action {
  Write-Host "This Line"
  .\src\Parser.ps1
  Write-host "That Line"
}

Я даже впал в отчаяние, чтобы перейти к двум файлам PS1 и двум пакетным файлам. Давайте просто скажем, что нет работа.

Общая команда командного файла, которую я использую:

powershell.exe -noexit C:\scripts\src\FileWatcher.ps1

Вопросы

Почему некоторые команды работают нормально при вызове из зарегистрированного события, а другие команды, такие как .NET, не работают?

Является ли то, что я пытаюсь достичь, возможно?

У вас есть лучший способ достичь моей цели? (Только сценарии, помните, что это исправление).

Ваш Ответ

1   ответ
3

Следующее сработало для меня (код в основном скопирован сВот):

$folder = 'c:\Temp'
$filter = '*.*'

$monitor = New-Object IO.FileSystemWatcher $folder, $filter -Property @{
  IncludeSubdirectories = $false;
  NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
}

Register-ObjectEvent $monitor Created -SourceIdentifier FileCreated -Action {
  $name = $Event.SourceEventArgs.FullPath
  $sr = New-Object System.IO.StreamReader($name)
  Write-Host $sr.ReadToEnd()
  $sr.Close()
}
Закрытие вопроса, потому что первоначальная проблема была решена. Может только сделать эту работу, добавив проверку ошибок везде. Пожалуйста, ответьте, если у вас есть лучшее решение. Cole9350
Эй, спасибо, вы показали мне, что это не проблема .net вообще. Я выяснил, что моя строка приводит к ошибке и останавливается. Кроме того, теперь, когда я наконец запустил все это, он выводит подробные операторы, но похоже, что он хранит все операторы write-host в стеке и выводит их все в конце. Я хотел бы, чтобы код обрабатывал ошибки плавно и продолжал работать, как обычно, если бы я запускал его вне Event. Я попытался установить $ ErrorActionPreference = Продолжить. Также я'Я все еще ищу простое объяснение того, как эти процессы работают. Я просто разбил свой рабочий компьютер из-за сотен процессов PS Cole9350

Похожие вопросы