PowerShell中一次显示多个文件的文件系统监视器

时间:2013-07-08 15:14:40

标签: powershell

我正在尝试编写一个位于那里的脚本,并等待将文件添加到文件夹中。如果它检测到任何,我希望它然后将它们移动到另一个文件夹。

网上有很多文章的代码类似于下面所示的代码,但如果你一次将多个文件放入文件夹,这些文章似乎都不起作用。

$folder = "d:\Logs\temp"
$filter = "*.xml"                           # <-- set this according to your requirements
$destination = "d:\Logs\XML\"
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{
 IncludeSubdirectories = $false       # <-- set this according to your requirements
 NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
}
$onCreated = Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action {
 $path = $Event.SourceEventArgs.FullPath
 $name = $Event.SourceEventArgs.Name
 $changeType = $Event.SourceEventArgs.ChangeType
 $timeStamp = $Event.TimeGenerated
 Write-Host "The file '$name' was $changeType at $timeStamp"
 Move-Item $path -Destination $destination -Force -Verbose # Force will overwrite files with same name
}

它们不仅不起作用,而且似乎完全陷入困境。有没有人有任何想法如何做到这一点?就我而言,一批XML文件将立即存入文件夹,需要依次处理。

谢谢!

3 个答案:

答案 0 :(得分:0)

执行此类操作的简单选项是设置一个每隔3-5分钟运行PowerShell脚本的计划任务。你可以调用的脚本就像这样简单:

$folder = "d:\Logs\temp"
$destination = "d:\Logs\XML\"
$filter = "*.xml"
Move-Item  ($folder+"\"+$filter) $destination -force 

这将仅移动与$filter匹配的文件({1}},并将它们全部放在$folder文件夹中。

http://windows.microsoft.com/en-GB/windows7/schedule-a-task

答案 1 :(得分:0)

你的代码是正确的,除了最后一行,这似乎是你写的唯一一个,所以让我们从那里开始。 Move-Item $path -Destination $destination -Force -Verbose # Force will overwrite files with same name 目的地为$destination = "d:\Logs\XML\"

从字面上看,复制/移动项目会占用目标源和目标路径的完整路径。虽然你试图复制到文件夹logs / xml中,但实际上你是将src复制到“logs”文件夹中的文件“xml”

希望你理解这个概念,如果你不好哦,就这样使用...... 移动项目

之前join-path $destination $name

PS ..这完全是你所指的东西。您可能知道,通常在powershell脚本中,它们可能会出错并完全继续,因为脚本是在运行时逐行编译的,这与许多编程语言不同。根据我的经验,使用powershell作为后台进程运行的事件不会保持这种行为。

我发现的唯一解决方法是错误检查。在尝试复制文件之前,请确保文件存在。在你尝试复制它之前确保你的文件夹在那里...更糟糕的是,只需从注册事件中取出代码,测试它以确保它永远不会生成红色文本,然后你应该是好的。

答案 2 :(得分:0)

这现在正在运行,我认为问题在于我已经用引用的数组对象替换了一些变量,这是一个导入的配置文件,这导致了问题。