Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 等待文件删除,然后复制文件夹_Loops_Powershell_While Loop_Wait_Delete File - Fatal编程技术网

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

Loops 等待文件删除,然后复制文件夹,loops,powershell,while-loop,wait,delete-file,Loops,Powershell,While Loop,Wait,Delete File,我有几个脚本,它们必须将文件夹从网络服务器同步到本地终端服务器,最后同步到%LOCALAPPDATA%。我需要首先检查文件夹是否正在同步(这是通过在服务器上创建一个临时COPYING.TXT来完成的),然后等待删除该文件夹,然后复制到%LOCALAPPDATA% 大概是这样的: 执行服务器端脚本,将我的文件夹同步到我的所有终端服务器 它会创建一个COPYING.TXT临时文件,表示同步正在进行。同步完成后,脚本将删除COPYING.TXT文件 如果有人在同步期间登录,我需要一个脚本来等待COP

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

大概是这样的:

  • 执行服务器端脚本,将我的文件夹同步到我的所有终端服务器
  • 它会创建一个COPYING.TXT临时文件,表示同步正在进行。同步完成后,脚本将删除COPYING.TXT文件
  • 如果有人在同步期间登录,我需要一个脚本来等待COPYING.TXT被删除,即同步完成,然后将本地同步恢复到他们的%LOCALAPPDATA%
(这样就可以在文件不存在的情况下复制文件夹,但我认为这不会干净地退出)

或:


但如果COPYING.TXT存在,该脚本将退出。我想我需要创建一个函数并在其内部插入该函数,或者一个嵌套的while循环,但这开始让我头疼。

您是否尝试过使用c#FileSystemWatcher来监视目标文件夹,当发生更改事件时,检查目标文件,如果它不存在,则您的预期时间即将到来:执行它

正如Mosser Lee所说,尝试使用该类。这是一个工作样本

#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

@user3317623我花了一些时间喝了杯冷咖啡,好好思考了一下,我找到了一个解决方案,但是我无法回答我自己的问题:(.function task{while(test path c:\folder\COPYING.txt){sleep-seconds 1}cp c:\folder\program$env:LOCALAPPDATA \-recurse-force exit}task嘿,谢谢你的帖子,我接受了这个答案,但我做不到“向上投票”你的帖子,因为我需要15个声誉。再次感谢你的帖子。干杯。
$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