首页 > 解决方案 > 为什么文件下载后无法移动?

问题描述

我正在尝试运行一个简单的脚本,该脚本会检测何时将某个文件类型下载到我的下载目录,然后将其移动到正确的位置。我还没有添加实际的文件类型过滤,因为我被困在“检测正在下载的文件”部分。

如果我自己在“下载”中创建一个文件,该脚本就可以工作。但是,如果 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}

标签: powershell

解决方案


无论如何,您的代码都可以在Linux上运行。这是我的设置:

测试.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 night out.JPG.crdownload”,因为它不存在。在 /home/veefu/watched/test.ps1:14 char:5 + Move-Item -Path $path -Destination $destpath + ~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (/home/veefu/wa....JPG.crdownload:String) [Move-Item] ,ItemNotFoundException + FullyQualifiedErrorId:PathNotFound,Microsoft.PowerShell.Commands.MoveItemCommand Move-Item:找不到路径'/home/veefu/watched/sourcefolder/after night out.JPG.crdownload',因为它不存在。在 /home/veefu/watched/test.ps1:14 char:5 + Move-Item -Path $path -Destination $destpath + ~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (/home/veefu/wa....JPG.crdownload:

Linux 上的事件可能与 Windows 上生成的事件不同。

我为测试选择的文件大小也可能导致与您选择的不同的结果。从错误来看,在侦听器尝试处理事件时,.jpg 似乎已经被重命名。

您可以尝试从监视作业中读取错误事件,以获取有关问题的线索:

Get-Job | Receive-Job

while($true) {sleep 5}此外,如果您从 powershell 控制台运行脚本,则不需要;只要您的 powershell 进程执行,负责侦听的工作就应该持续存在。

就此而言,您可能需要检查您有多少作业正在运行并使用清理任何剩余的Get-JobStop-JobRemove-Job


推荐阅读