我们有一个复杂的解决方案来解决一些由Citrix和远程服务器引起的打印问题。基本上,从主服务器,我们强制推送一个PDF文件到远程电脑,然后在远程电脑上不断运行一个PowerShell脚本来“捕捉”该文件并将其推送到本地打印机。
这个方法 “基本上可以正常工作”。
但是我们遇到了随机掉线的问题。PowerShell脚本似乎没有崩溃,因为它仍在Windows上运行,但实际操作似乎无法处理新文件。
今天我做了很多阅读,有提到在完成后必须命名和注销事件,否则可能会导致缓冲区溢出问题并使PowerShell停止处理操作。但我不确定在代码中应该放在哪里。想法是这个脚本将永久运行,所以我们是在操作本身内部还是其他地方注销或删除事件呢?
之前我进行了大量虚假日志记录来尝试找到它失败的位置,但它似乎在不同的点处停止,没有任何合理的原因(即,它会在查找文件的命令处失败,其他时候在移动等命令处失败)。
这个方法 “基本上可以正常工作”。
但是我们遇到了随机掉线的问题。PowerShell脚本似乎没有崩溃,因为它仍在Windows上运行,但实际操作似乎无法处理新文件。
今天我做了很多阅读,有提到在完成后必须命名和注销事件,否则可能会导致缓冲区溢出问题并使PowerShell停止处理操作。但我不确定在代码中应该放在哪里。想法是这个脚本将永久运行,所以我们是在操作本身内部还是其他地方注销或删除事件呢?
之前我进行了大量虚假日志记录来尝试找到它失败的位置,但它似乎在不同的点处停止,没有任何合理的原因(即,它会在查找文件的命令处失败,其他时候在移动等命令处失败)。
### SET FOLDER TO WATCH + FILES TO WATCH + SUBFOLDERS YES/NO
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "l:\files\cut"
$watcher.Filter = "*.pdf"
$watcher.IncludeSubdirectories = $false
$watcher.EnableRaisingEvents = $true
### DEFINE ACTIONS AFTER AN EVENT IS DETECTED
$action = { $path = $Event.SourceEventArgs.FullPath
$changeType = $Event.SourceEventArgs.ChangeType
$scandir="l:\files\cut"
$scanbackdir="l:\files\cut\back"
$scanlogdir="l:\files\cut\log"
$sumatra="l:\SumatraPDF.exe"
$pdftoprint=""
$printername= "MainLBL"
### Get the List of files in the Directory, print file, wait and then move file
Get-ChildItem -Path $scandir -filter "*.pdf" -Name | % {
$pdftoprint=$_
& $sumatra -silent $scandir\$pdftoprint -print-to $printername
sleep 3
Move-Item -force $scandir\$pdftoprint $scanbackdir
}
}
### Define what happens when script fails
$erroraction = {echo $(get-date) the process crashed | Out-File -Append l:\files\cut\log\errorlog.txt}
### DECIDE WHICH EVENTS SHOULD BE WATCHED
Register-ObjectEvent $watcher "Error" -Action $erroraction
Register-ObjectEvent $watcher "Created" -Action $action
while ($true) {sleep 5}
[system.io.file]::Open
添加文件锁,或者使用[system.io.file]::Copy($fileName, $newFilename); [system.io.file]::Delete($fileName) ; ;
,因为文件移动有时会在遇到 ACL 权限问题时删除文件而不是移动它。 - lloyd