Я пишу сценарий 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
}
Спасибо за предложение! Я действительно пробовал это уже, хотя и, к сожалению, это не помогло:/ На самом деле я переместил doStuff до начала, но не backupSave, я постараюсь переместить их завтра, когда смогу, и если это работы Я отправлю обратно – kamcknig
Можете ли вы также включить часть вывода? и любые сообщения об ошибках? – HAL9256
Если я нахожусь в ISE, я получаю весь ожидаемый результат. Когда я копирую новый файл, я получаю созданное событие, затем несколько измененных событий (в зависимости от размера файла), а затем все правильные сообщения для savintg и резервное копирование файла. Когда я запускаю его в консоли powershell и копирую файл по единственному результату, я получаю вывод «измененное событие», но никаких ошибок. – kamcknig