【发布时间】:2016-09-08 23:52:18
【问题描述】:
在监视文件夹以创建扩展名为 .csv 的新文件的 PowerShell 脚本方面需要一些帮助。
当检测到新文件的创建时,会发生以下操作……
- 文件的详细信息发送到日志文件
- 文件的副本被发送到另一个名为“1_ToBeProcessed\MyImport.csv”的文件夹(注意文件已重命名为 MyImport.csv)
- 文件已移至目录“\MYSERVER\MYCOMPANY\MYFOLDER\MyHistory”(使用其原始文件名)
- 调用一个表达式来运行一个 .bat 文件,该文件将获取位于“\MYSERVER\MYCOMPANY\MYFOLDER\1_ToBeProcessed”中的文件并将该文件导入应用程序。
- 然后该脚本会休眠 60 秒以允许导入完成,然后再处理下一个文件。
除非在脚本运行时创建另一个文件,否则此脚本一切正常。
同一类型的多个文件可能会同时命中监视文件夹。因此,脚本可能会遍历五个文件,然后另一个文件可能会进入目录。发生这种情况时,脚本似乎会重新开始并开始循环遍历文件……但它会一遍又一遍地循环相同的文件。 我希望有人能指出我在这个脚本中做错了什么。由于添加了新文件,我如何让它在重新开始之前完成当前循环中正在处理的文件? 我们将不胜感激任何可以提供的帮助!
这是我目前拥有的......
#Define watcher; Set path to watch; Set filter on file type
$filewatcher = New-Object System.IO.FileSystemWatcher
$filewatcher.Path = "\\MYSERVER\MYCOMPANY\MYFOLDER"
$filewatcher.Filter = "*.csv"
#Define "move to" and "copy to" paths
$moveTo = "\\MYSERVER\MYCOMPANY\MYFOLDER\MyHistory"
$copyTo = "\\MYSERVER\MYCOMPANY\MYFOLDER\1_ToBeProcessed\MyImport.csv"
#Define actions after an Event is Detected
$action = {$files = Get-ChildItem -Path $filewatcher.Path -Filter filewatcher.Filter
foreach ($file in $files)
{
#Define variables for log file
$changeType = $Event.SourceEventArgs.ChangeType
$logline = "$(Get-Date), $changeType, $file"
#Actions to take
Add-Content "\\MYSERVER\MYCOMPANY\MYFOLDER\3_Log\MyImportLog.txt" -value $logline
Copy-Item $file.FullName -Destination $copyTo
Move-Item $file.FullName -Destination $moveTo -Force
Invoke-Expression "& '\\MYSERVER\MYCOMPANY\MYFOLDER\4_Scripts\PSscriptToRunBATfile.ps1'"
#Pause the script for 60 seconds to allow it to finish posting the import before going to the next record
Start-Sleep -Seconds 60
}
}
#Decide which events should be watched and set check frequency
$onCreated = Register-ObjectEvent -InputObject $filewatcher -EventName "Created" -SourceIdentifier FileCreated -Action $action
【问题讨论】:
标签: powershell filesystemwatcher