等待文件删除,然后复制文件夹

时间:2014-06-12 00:09:06

标签: loops powershell while-loop wait delete-file

我有几个脚本需要将文件夹从网络服务器同步到本地终端服务器,最后进入%LOCALAPPDATA%。我需要先检查文件夹是否正在同步(这是通过在服务器上创建一个临时的COPYING.TXT来完成的),然后等到它被删除,然后复制到%LOCALAPPDATA%。

这样的事情:

  • 执行服务器端脚本,将我的文件夹同步到我的所有终端服务器。
  • 它会创建一个COPYING.TXT临时文件,表示同步正在进行中。同步完成后,脚本将删除COPYING.TXT
  • 如果有人在同步过程中登录,我需要一个脚本等待COPYING.TXT被删除I.E同步完成,然后将本地同步恢复到%LOCALAPPDATA%。
do {
  cp c:\folder\program $env:LOCALAPPDATA\
} while ( !(test-path c:\folder\COPYING.txt) )

(因此复制文件夹时文件DOESN' T存在,但我不认为它会彻底退出)

或者:

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循环,但这开始让我头疼。

2 个答案:

答案 0 :(得分:1)

正如Mosser Lee所说,尝试使用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在2014年6月12日下午3:01:48删除"何时删除文件。它还设置了一个全局变量$ 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      :

请勿忘记取消注册该事件,因为即使您将$ watcher设置为null,它也将继续运行,直到您关闭会话。

Unregister-Event $evt.Id

答案 1 :(得分:0)

您是否尝试使用c#FileSystemWatcher来监视目标文件夹,当引发更改事件时,然后检查目标文件,如果没有退出,则预期时间即将到来:执行此操作。