如何检查文件夹中是否有任何新文件?
How to check the folder on the appearance in it of any new file?
请帮忙。我找不到解决办法。 (Windows 平台)
我需要:
- 扫描文件夹
- 如果您收到任何新文件。
- 处理文件。
您可以使用 FileSystemWatcher
class 监控文件夹中的新文件。
也可以很容易地used from PowerShell:
$FSW = New-Object System.IO.FileSystemWatcher
然后使用 Register-ObjectEvent
到 "listen" 引发的事件
在不知道您要执行什么的情况下,我只能提供这些。理论上,您会 运行 每 1 小时将其作为计划任务:
foreach ($file in (Get-ChildItem "C:\TargetDirectory" | where {$_.lastwritetime -gt (Get-Date).AddHours(-1)})) {
# Execute-Command -Target $file
}
另一种检测"new files"的方法是存档属性。每当创建或更改文件时,此属性由 windows 设置。
每当您处理文件时,取消设置它的存档属性 (attrib -a file.ext
)。
优点是,你不依赖于任何时间。
要列出 "new"(或更改的)文件,请使用 dir /aa
(dir /a-a
将列出已处理的文件)
有关更多信息,请参阅 dir /?
和 attrib /?
FileSystemWatcher 是我最近学习的一个实用程序,以后一定会用到。最好的部分是它依赖于 .net 事件,因此您不需要构建外部触发结构。
这是我如何在 24/7 生产环境中使用它的示例(完整脚本接收 xml,对其进行处理,然后将结果插入 SQL 中 under 3秒)。
Function submit-resultFile {
#Actual file processing takes place here
}
Function create-fsw {
Register-ObjectEvent $fsw Created -SourceIdentifier "Spectro FileCreated" -Action {
$name = $Event.SourceEventArgs.Name
$File = $Event.SourceEventArgs.Fullpath
$changeType = $Event.SourceEventArgs.ChangeType
$timeStamp = $Event.TimeGenerated
Write-Verbose "The file '$name' was $changeType at $timeStamp" -fore green
submit-ResultFile -xmlfile $file
}
}
# In the following line, you can change 'IncludeSubdirectories to $true if required.
$fsw = New-Object IO.FileSystemWatcher $watchFolder, $watchFilter -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}
$xmlFiles = Get-ChildItem -Path $ResultsDirectory -Filter *.xml
foreach ($file in $xmlfiles)
{
submit-ResultFile -xmlfile $File.FullName
}
Create-fsw
# Register a new File System Watcher
需要注意的几个要点:
- 如果在创建 FSW 之前该位置存在文件,它们将不会触发 "objectevent",因此在我的脚本中,您会看到我首先 运行 扫描现有文件。
- 当 FSW 确实触发时,您希望它一次只处理 1 个文件。由于下一个文件创建事件将生成一个新的 "objectevent"。构建 FSW 以在每个触发器上处理多个文件最终会导致崩溃。
请帮忙。我找不到解决办法。 (Windows 平台) 我需要:
- 扫描文件夹
- 如果您收到任何新文件。
- 处理文件。
您可以使用 FileSystemWatcher
class 监控文件夹中的新文件。
也可以很容易地used from PowerShell:
$FSW = New-Object System.IO.FileSystemWatcher
然后使用 Register-ObjectEvent
到 "listen" 引发的事件
在不知道您要执行什么的情况下,我只能提供这些。理论上,您会 运行 每 1 小时将其作为计划任务:
foreach ($file in (Get-ChildItem "C:\TargetDirectory" | where {$_.lastwritetime -gt (Get-Date).AddHours(-1)})) {
# Execute-Command -Target $file
}
另一种检测"new files"的方法是存档属性。每当创建或更改文件时,此属性由 windows 设置。
每当您处理文件时,取消设置它的存档属性 (attrib -a file.ext
)。
优点是,你不依赖于任何时间。
要列出 "new"(或更改的)文件,请使用 dir /aa
(dir /a-a
将列出已处理的文件)
有关更多信息,请参阅 dir /?
和 attrib /?
FileSystemWatcher 是我最近学习的一个实用程序,以后一定会用到。最好的部分是它依赖于 .net 事件,因此您不需要构建外部触发结构。
这是我如何在 24/7 生产环境中使用它的示例(完整脚本接收 xml,对其进行处理,然后将结果插入 SQL 中 under 3秒)。
Function submit-resultFile {
#Actual file processing takes place here
}
Function create-fsw {
Register-ObjectEvent $fsw Created -SourceIdentifier "Spectro FileCreated" -Action {
$name = $Event.SourceEventArgs.Name
$File = $Event.SourceEventArgs.Fullpath
$changeType = $Event.SourceEventArgs.ChangeType
$timeStamp = $Event.TimeGenerated
Write-Verbose "The file '$name' was $changeType at $timeStamp" -fore green
submit-ResultFile -xmlfile $file
}
}
# In the following line, you can change 'IncludeSubdirectories to $true if required.
$fsw = New-Object IO.FileSystemWatcher $watchFolder, $watchFilter -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}
$xmlFiles = Get-ChildItem -Path $ResultsDirectory -Filter *.xml
foreach ($file in $xmlfiles)
{
submit-ResultFile -xmlfile $File.FullName
}
Create-fsw
# Register a new File System Watcher
需要注意的几个要点: - 如果在创建 FSW 之前该位置存在文件,它们将不会触发 "objectevent",因此在我的脚本中,您会看到我首先 运行 扫描现有文件。
- 当 FSW 确实触发时,您希望它一次只处理 1 个文件。由于下一个文件创建事件将生成一个新的 "objectevent"。构建 FSW 以在每个触发器上处理多个文件最终会导致崩溃。