我有几个脚本需要将文件夹从网络服务器同步到本地终端服务器,最后进入%LOCALAPPDATA%。我需要先检查文件夹是否正在同步(这是通过在服务器上创建一个临时的COPYING.TXT来完成的),然后等到它被删除,然后复制到%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循环,但这开始让我头疼。
答案 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来监视目标文件夹,当引发更改事件时,然后检查目标文件,如果没有退出,则预期时间即将到来:执行此操作。