2014-06-12 4 views
1

У меня есть несколько скриптов, которые должны синхронизировать папку с сетевого сервера, на локальный сервер терминалов и, наконец, в% LOCALAPPDATA%. Мне нужно сначала проверить, синхронизируется ли папка (это делается путем создания временного COPYING.TXT на сервере) и ждать, пока это не будет удалено, затем нажмите кнопку% LOCALAPPDATA%.Подождите, пока файл будет удален, а затем скопируйте папку

Что-то вроде этого:

  • Серверный скрипт выполняется, который синхронизирует свою папку для всех моих серверов терминалов.
  • Создает временный файл COPYING.TXT, который указывает, что синхронизация выполняется. Как только синхронизация завершена, сценарий удаляет COPYING.TXT
  • Если кто-то вошел во время синхронизации, мне нужен сценарий, чтобы ждать, пока COPYING.TXT не будет удален. IE синхронизируется, а затем возобновляет локальную синхронизацию % LOCALAPPDATA%.
do { 
    cp c:\folder\program $env:LOCALAPPDATA\ 
} while (!(test-path c:\folder\COPYING.txt))

(Так что копирует папку, пока файл не существует, но я не думаю, что выходит из чисто)

Или:

while (!(test-path c:\folder\COPYING.txt)) { 
    cp c:\folder\program $env:LOCALAPPDATA\ -recurse -force 
    if (!(test-path c:\folder\program)) {return} 
} 

Но этот сценарий завершает работу если существует COPYING.TXT. Я думаю, мне нужно создать функцию и вставить эту функцию внутри себя или вложенный цикл while, но это начинает заставлять мою голову болеть.

+0

@ user3317623 У меня было какое-то время для холодной пресс кофе и хороший думать, и я нашел решение, однако я не могу ответить на мой собственный вопрос :( – user3317623

+0

функция задачи { в то время (тест-путь с.: \ папка \ COPYING.txt) {сон -seconds 1} ф с: \ папка \ программа $ ENV: LOCALAPPDATA \ -recurse -force выход } задача – user3317623

ответ

0

У вас есть попытка использовать C# FileSystemWatcher, чтобы отслеживать целевую папку, когда событие изменения было поднято, а затем проверить целевой файл, если он не выходит, ваше ожидаемое время идет: сделайте это.

1

Как сказал Моссер Ли, попробуйте использовать класс FileSystemWatcher. Вот рабочий образец.

#Create the Copying.txt file 
"test"|Out-File Copying.txt 
#Create a filesystemwatcher 
$watcher = New-Object System.IO.FileSystemWatcher 
#Give it the root path to monitor 
$watcher.Path = $pwd 
#The matching pattern 
$watcher.Filter = "Copying.txt" 
#Monitor subfolder or not 
$watcher.IncludeSubdirectories = $true 
#Setup event and save a ref 
$evt = Register-ObjectEvent $watcher Deleted FileDeleted -Action { 
    #Stuff it into the global space just so you can inspect it 
    $global:SomeVar = $Event 
    Write-Host ("{0} deleted at {1}" -f $Event.SourceEventArgs.FullPath, $Event.TimeGenerated) 
} 

Remove-Item Copying.txt 

Это дает выход как "H: \ COPYING.txt удален на 6/12/2014 3:01:48 PM", когда файл будет удален. Он также устанавливает глобальную переменную $ global: SomeVar, если вы хотите глубже изучить свойства.

$global:SomeVar 

ComputerName  : 
RunspaceId  : 1ab5089e-1734-4b92-8bab-9de4df78ada2 
EventIdentifier : 2 
Sender   : System.IO.FileSystemWatcher 
SourceEventArgs : System.IO.FileSystemEventArgs 
SourceArgs  : {System.IO.FileSystemWatcher, Copying.txt} 
SourceIdentifier : FileDeleted 
TimeGenerated : 6/12/2014 3:01:48 PM 
MessageData  : 

Не забудьте отменить событие, как он будет продолжать работать, пока вы не закрыть сессию, даже если вы установите $ Бодрствующего в нуль.

Unregister-Event $evt.Id 
+0

Эй дружище, спасибо за этот пост, я принял его в качестве ответьте, но я не могу «отменить» ваш пост, потому что мне нужно 15 репутаций. Еще раз спасибо за ваш пост. – user3317623

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