2014-07-24 2 views
0

Я пишу сценарий powershell, который запустит процесс, проверит папку для изменений файла и затем создаст резервную копию этой папки, когда файлы будут добавлены/изменены.Скрипт Powershell работает в ISE, но не в консоли

Если я запускаю свой сценарий из ISE Powershell, он отлично работает, я могу контролировать папку, и она будет правильно сохранять резервную копию, как ожидалось.

Проблема в том, что я хочу запустить командный файл, который будет запускать скрипт powershell. Но всякий раз, когда я запускаю сценарий с консоли powershell, или когда я запускаю свой пакетный файл, который запускает скрипт, он больше не работает. Скрипт запускается, и события регистрируются. Однако, когда я копирую файл в наблюдаемую папку, я ТОЛЬКО получаю измененное событие, а не созданное событие, а функция doStuff больше не вызывается. Я не уверен, как это сделать, отлаживая это:/

Ниже приведен мой сценарий. Я удалил части, которые не относятся к тому, что в действительности актуально, поэтому некоторые переменные, которые я использую здесь, вы не увидите, но они есть. Я получаю записи хозяина к консоли, когда измененное событие происходит, но не созданное событие (хотя, как указано eariler в ISE, я получаю оба события, и все работает просто отлично)

#unregister events, in case they weren't unregistered properly before. Just error  siliently if they don't exist 
Unregister-Event ConsoleStopped -ErrorAction SilentlyContinue 
Unregister-Event FileCreated -ErrorAction SilentlyContinue 
Unregister-Event FileChanged -ErrorAction SilentlyContinue 
Unregister-Event TimerTick -ErrorAction SilentlyContinue 

#start the console process 
Write-Host Starting console process... 
$consoleProcess = Start-Process "$consoleExe" -PassThru 

#register to listen for when the console stops 
Register-ObjectEvent $consoleProcess Exited -SourceIdentifier ConsoleStopped -Action { 
    Write-Host Console stopped 

    #unregister events 
    Unregister-Event ConsoleStopped -ErrorAction SilentlyContinue 
    Unregister-Event FileCreated -ErrorAction SilentlyContinue 
    Unregister-Event FileChanged -ErrorAction SilentlyContinue 

    if(!$timer.Enabled) { 
     Unregister-Event TimerElapsed -ErrorAction SilentlyContinue 
     Remove-Item $timer 
    } 

    Remove-Item $fsw 
    Remove-Item $consoleProcess 
} 

#watch all files/folders 
$filter = '*.*' # You can enter a wildcard filter here. 

# In the following line, you can change 'IncludeSubdirectories to $true if required.       
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property  @{IncludeSubdirectories = $true;NotifyFilter = [IO.NotifyFilters]'DirectoryName, FileName,  LastWrite'} 

#register for FileCreated event 
Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action { 
    write-host Created event has occurred 
    doStuff($Event) 
} 

#register for FileChanged event 
Register-ObjectEvent $fsw Changed -SourceIdentifier FileChanged -Action { 
    Write-Host Change event has occurred 
    doStuff($Event) 
} 

function doStuff($event) 
{ 
    write-host doStuff has been called 

    $name = $Event.SourceEventArgs.Name 
    $changeType = $Event.SourceEventArgs.ChangeType 
    $timeStamp = $Event.TimeGenerated 
    Write-Host "The file '$name' in '$folder' was $changeType at $timeStamp" -fore  green 

    if(!$timer.Enabled) { 
     Write-Host Starting save timer 
     Register-ObjectEvent $timer Elapsed -SourceIdentifier TimerElapsed -Action $TimerAction 
     $timer.Start() 
     Out-File "$backupDir\backup.log" -Append -Force -InputObject "A request for a backup created at $timeStamp" 
    } 
    else { 
     Write-Host A backup has already been request 
    } 
} 

function backupSave() 
{ 
    Write-Host Starting backup... 
    $timestamp = Get-Date -Format o | foreach { $_ -replace ":", "." } 
    Copy-Item $folder "$backupDir\backup_$timestamp" -Recurse -Force 
} 

ответ

0

Try двигая функции начало вашего скрипта.

i.e. перемещение function doStuff($event) и function backupSave() в начало сценария.

Проблема может быть в том, что, когда вы вызываете функции из сценария, они еще не определены. Он работает в Powershell ISE, потому что вы запускали скрипт несколько раз, и функции были определены в тот или иной момент.

+0

Спасибо за предложение! Я действительно пробовал это уже, хотя и, к сожалению, это не помогло:/ На самом деле я переместил doStuff до начала, но не backupSave, я постараюсь переместить их завтра, когда смогу, и если это работы Я отправлю обратно – kamcknig

+0

Можете ли вы также включить часть вывода? и любые сообщения об ошибках? – HAL9256

+0

Если я нахожусь в ISE, я получаю весь ожидаемый результат. Когда я копирую новый файл, я получаю созданное событие, затем несколько измененных событий (в зависимости от размера файла), а затем все правильные сообщения для savintg и резервное копирование файла. Когда я запускаю его в консоли powershell и копирую файл по единственному результату, я получаю вывод «измененное событие», но никаких ошибок. – kamcknig

Смежные вопросы