powershell - 为什么文件下载后无法移动?
问题描述
我正在尝试运行一个简单的脚本,该脚本会检测何时将某个文件类型下载到我的下载目录,然后将其移动到正确的位置。我还没有添加实际的文件类型过滤,因为我被困在“检测正在下载的文件”部分。
如果我自己在“下载”中创建一个文件,该脚本就可以工作。但是,如果 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}
解决方案
无论如何,您的代码都可以在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-Job
,Stop-Job
和Remove-Job
推荐阅读
- node.js - 如何使用 nodejs 和 postman 将文件上传到 firebase?
- reactjs - 如何在 react-native-image-picker 中获取文件大小(以字节为单位)并设置最大文件大小
- php - 如何阻止网址中的空格
- twitter-bootstrap - Bootstrap:如何制作简单的全高布局?
- python - 在 azure blob 存储上保存 matplotlib 图
- ios - iOS [[MPMediaQuery playlistsQuery] collections] 在第一次运行时返回“播放历史”
- c - 运行时错误:加载“int”类型的空指针
- javascript - 如何使用 Formik 和 React 实现可添加字段?
- python - 我如何使用for循环继续添加数字
- javascript - 从 codepen 导出时,此 javascript 将不起作用。代码必须在一页中运行