【问题标题】:Why can't I move a file after it's downloaded?为什么文件下载后无法移动?
【发布时间】:2018-08-31 00:21:15
【问题描述】:

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

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

【问题讨论】:

  • 您是在等到下载完成吗? FileSystemWatcher 可能会为您提供 Create 事件,但文件在下载时仍处于独占锁定状态,并且很可能已重命名。除了Created,你还有哪些可以参与的活动?
  • @NoRefundsNoReturns 正确,刚刚确认了这一点。我正在做一些测试以找到解决方法,也许是“再试一次”类型的交易。
  • 嗯。也许Renamed? Chrome 以 UnconfirmedDownload.02847028 之类的形式开始,然后在完成时为其提供正确的名称。
  • 这是一个旧答案,但链接已经消失。寻找当前的:stackoverflow.com/questions/46730384/…
  • 我搞定了,它一直在复制 .tmp 文件,但不是我用作测试的 .pdf。

标签: powershell


【解决方案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

Move-Item : 找不到路径 '/home/veefu/watched/sourcefolder/after night out.JPG.crdownload' 因为它不存在。在 /home/veefu/watched/test.ps1:14 char:5 + 移动项目 - 路径 $path -Destination $destpath + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (/home/veefu/wa....JPG.crdownload:String) [移动项目], ItemNotFoundException + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.MoveItemCommand 移动项目 : 找不到路径'/home/veefu/watched/sourcefolder/after night out.JPG.crdownload' 因为它不存在。在 /home/veefu/watched/test.ps1:14 char:5 + 移动项目 - 路径 $path -Destination $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-JobStop-JobRemove-Job 来检查您正在运行的作业数量并清理剩余的作业

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-06
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-06
    • 2020-11-23
    • 1970-01-01
    相关资源
    最近更新 更多