PowerShell文件夹监控脚本调用mongoimport失效问题排查
嘿,我瞅了下你的脚本,问题确实出在Invoke-Command的用法上,还有mongoimport的参数格式也有问题。下面是修正后的完整脚本,我给你拆解下关键的修改点:
修正后的PowerShell监控导入脚本
1. 监控文件夹配置(微调,增加写入完成检测)
$watcher = New-Object System.IO.FileSystemWatcher $watcher.Path = "C:\git\DataChain\UploadStation\to" $watcher.Filter = "*.json" $watcher.IncludeSubdirectories = $true $watcher.EnableRaisingEvents = $true # 增加这个配置,确保只在文件名称确定、写入完成时触发事件 $watcher.NotifyFilter = [System.IO.NotifyFilters]::FileName -bor [System.IO.NotifyFilters]::LastWrite
2. 定义事件触发动作(核心修正)
$action = { $path = $Event.SourceEventArgs.FullPath # 加个短延迟,避免文件还没写完就开始导入(FileSystemWatcher有时会提前触发) Start-Sleep -Milliseconds 500 # 直接调用mongoimport,这是本地运行外部程序的正确方式,不用Invoke-Command & "C:\Program Files\MongoDB\Server\3.4\bin\mongoimport.exe" ` --db myDB ` --collection jsonFiles ` --type json ` --file $path # 可选:输出导入结果,方便排查问题 if ($LASTEXITCODE -eq 0) { Write-Host "✅ 成功导入文件: $path" } else { Write-Host "❌ 导入文件失败: $path,错误码: $LASTEXITCODE" } }
3. 注册监控事件并保持运行
Register-ObjectEvent $watcher "Created" -Action $action | Out-Null Write-Host "开始监控文件夹: $($watcher.Path)" while ($true) {Start-Sleep 5}
关键修改说明:
- 换掉Invoke-Command:这个cmdlet是用来远程执行命令的,本地运行exe完全没必要用它。用
&操作符直接调用程序才是本地执行外部命令的正确姿势。 - 修正mongoimport参数格式:你原来的参数写法不对,mongoimport需要用
--db、--collection这种带双短横线的参数名,而且要把每个参数拆成单独的字符串(PowerShell会自动处理路径里的空格)。 - 增加文件写入等待:FileSystemWatcher的
Created事件经常会在文件还没完全写入磁盘时就触发,加个500毫秒的延迟能避免导入不完整的JSON文件。 - 添加结果反馈:通过
$LASTEXITCODE可以判断mongoimport是否执行成功,方便你排查导入失败的情况。
内容的提问来源于stack exchange,提问作者m.alsioufi
相关产品推荐
相关产品推荐

