我正在尝试运行一个简单的脚本,该脚本检测何时将某种文件类型下载到我的Downloads目录中,然后将其移至正确的位置。我还没有添加实际的文件类型过滤,因为我停留在“检测文件是否已全部下载”部分。
如果我自己在“下载”中创建文件,该脚本将起作用。但是,如果Chrome在下载文件时创建了文件,则该文件将无法正常运行。它会打印“正在工作”,因此它正在检测文件的创建,但是并没有移动它。
为什么会这样?
### Set folder and files to watch and misc flags
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "C:\Users\Aerovistae\Downloads"
$watcher.Filter = "*.*"
$watcher.IncludeSubdirectories = $false
$watcher.EnableRaisingEvents = $true
### Define actions to be taken when an event is detected
$action = { $path = $Event.SourceEventArgs.FullPath
Write-Host "working!"
Move-Item -Path $path -Destination "C:\Users\Aerovistae\Desktop"
}
### Decide which events to watch
Register-ObjectEvent $watcher "Created" -Action $action
while ($true) {sleep 5}
答案 0 :(得分:1)
您的代码仍然可以在Linux上运行。这是我设置的:
test.ps1:
$sourcepath = '/home/veefu/watched/sourcefolder'
$destpath = '/home/veefu/watched/destfolder'
$watcher = New-object System.io.filesystemwatcher
$watcher.path = $sourcepath
$watcher.Filter = "*.*"
$watcher.IncludeSubdirectories = $false
$watcher.EnableRaisingEvents = $true
$action = {
$path = $event.SourceEventARgs.FullPath
Move-Item -Path $path -Destination $destpath
}
Register-ObjectEvent $watcher 'Created' -action $action
开始于:
. ./test.ps1
为了进行测试,我下载了一个带有chrome的.jpg文件并将其保存到$sourcepath
。向侦听作业发出了以下错误,但最后移动了.jpg文件 :
> get-job |Receive-Job
移动项:找不到路径'/ home / veefu / watched / sourcefolder / after 晚上out.JPG.crdownload”,因为它不存在。在 /home/veefu/watched/test.ps1:14 char:5 + Move-Item-路径$ path-目标$ destpath + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:ObjectNotFound:(/ home / veefu / wa .... JPG.crdownload:String)[移动项], ItemNotFoundException + FullyQualifiedErrorId:PathNotFound,Microsoft.PowerShell.Commands.MoveItemCommand移动项 :找不到路径'/ home / veefu / watched / sourcefolder / night after out.JPG.crdownload”,因为它不存在。在 /home/veefu/watched/test.ps1:14 char:5 + Move-Item-路径$ path-目标$ destpath + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:ObjectNotFound:(/ home / veefu / wa .... JPG.crdownload:String)[移动项], ItemNotFoundException + FullyQualifiedErrorId:PathNotFound,Microsoft.PowerShell.Commands.MoveItemCommand
Linux上的事件可能与Windows上生成的事件不同。
我为测试选择的文件大小也可能导致与您选择的文件结果不同的结果。从错误来看,当侦听器尝试处理该事件时,.jpg似乎已经重命名。
您可以尝试从观看任务中读取错误事件,以获取有关以下问题的线索:
Get-Job | Receive-Job
此外,如果您是从Powershell控制台运行脚本的,则不需要while($true) {sleep 5}
。只要您的Powershell程序能够完成,负责监听的工作就应该持续下去。
为此,您可能需要使用Get-Job
,Stop-Job
和Remove-Job
检查正在运行的作业并清除剩余的内容