0

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

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

$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文件会一次性存入文件夹,需要依次处理。

谢谢!

4

3 回答 3

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 作为作为后台进程运行的事件不会保持这种行为。

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

于 2013-07-08T18:23:25.107 回答
0

这现在可以工作了,我认为问题是我已经用对数组对象的引用替换了一些变量,该数组对象是一个导入的配置文件,这导致了问题。

于 2013-07-11T10:07:42.413 回答
0

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

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

这将仅移动与$filter开头匹配的文件$folder并将它们全部放入$desination文件夹中。

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

于 2013-07-08T15:46:59.830 回答