【问题标题】:Powershell GUI Drag-and-Drop empty arg from email attachmentsPowershell GUI 从电子邮件附件拖放空参数
【发布时间】:2020-09-29 02:59:20
【问题描述】:

我有一个带有只读文本框的 GUI,我将文件拖到该文本框,然后一个函数与该文件一起运行。这在我的机器上适用于本地下载文件夹中的文件、所有文件扩展名、Outlook 电子邮件附件等。我没有问题。

一位同事已开始使用它,但他无法成功地将电子邮件附件从 Outlook 拖到框中。 arg 为空。这一切都适用于我的机器,但不是他的。我有另一个人测试,他们也有同样的问题。

$filebox.Add_DragEnter({
    if ($_.Data.GetDataPresent([Windows.Forms.DataFormats]::FileDrop)) {
        $_.Effect = [Windows.Forms.DragDropEffects]::Copy
    }
})
$filebox.Add_DragDrop({
    foreach ($file in $_.Data.GetData([Windows.Forms.DataFormats]::FileDrop)) {
        create_dir $file # Function doesn't even trigger here with outlook email attachments because no arg
    }
})

我们都从共享收件箱中提取信息。没有什么是硬编码来识别用户的,或者定义一个设置的路径,它应该只是抓住放在盒子里的 arg 的路径,对吧? 我只是对拖放对某些文件而不是电子邮件附件的工作感到困惑,然后在我的机器上也能完全工作。

我认为自己是一个相当新手的编码器,并且第一次弄乱了 Powershell。 (在这种情况下,我无法访问其他任何东西。无法编译 c#,powershell 就是它。)。也许我在这里遗漏了一些基本的东西。有人对此有什么想法吗?

【问题讨论】:

    标签: powershell outlook drag-and-drop


    【解决方案1】:

    文件格式不存在,因为文件系统上没有物理文件。见Upload fails when user drags and drops attachment from email client

    【讨论】:

    • 在我的机器上,如果我输出 $file arg 而不是运行 create_dir 函数,我会在 appData/local/temp 文件夹中获得一个文件路径,然后 create_dir 函数将运行。该函数根据文件名创建一个目录,并将文件复制到那里。感谢您的链接。这对我来说很有意义。我只是不明白为什么它适用于我的而不是他的。对我来说,文件似乎在文件系统上,因为路径的叶子是实际的文本文件。
    • 示例:我刚刚输出了 arg 路径,我得到了 C:\Users\{user}\AppData\Local\Temp\1\ed709666-5bdb-4b96-ac5f-c4-e6f2d384d0\G000B95X_20200609。 txt - 那个 txt 文件就是我要的文件。现在当我让我的同事做同样的事情时,输出只是空的。是它以某种方式为我工作的实际错误吗?哈哈
    • 有一些插件(我写了一个)可以拦截拖放开始并在临时文件夹中提供一个实际文件供外部使用。您的机器上安装了哪些插件?
    • 我让它工作了。您的链接肯定让我走上了正确的道路。出于好奇,我拉出了我的加载项,并认为它们看起来都像标准加载项。至于修复:我有 drop 事件检查 filedrop,如果没有,我们假设它是一个 Outlook 附件(不知道如何定义和专门检查 Outlook 附件)并将文件保存到下载文件夹,然后继续使用新创建的下载路径。干杯,谢谢
    【解决方案2】:
    $filebox.Add_DragDrop({
        if ($_.Data.GetDataPresent([System.Windows.Forms.DataFormats]::FileDrop)) {
            foreach ($file in $_.Data.GetData([System.Windows.Forms.DataFormats]::FileDrop)) {
                create_dir $file
            }
        }
        else {
            $outlook = New-Object -ComObject Outlook.Application
            $s = $outlook.ActiveExplorer().Selection
            foreach ($item in $s){
                foreach($a in $item.Attachments){
                    $name = Join-Path -Path $dlpath -ChildPath $a.filename
                    $a.SaveAsFile($name)
                    create_dir $name
                }
            }
        }
    })
    

    正如 Dmitry 所说,这些文件实际上并没有保存在机器上,所以我不能只是 Copy-Item。在这里,文件被保存,然后调用create_dir函数,它可以从新的下载路径复制项目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-26
      • 2010-10-28
      • 2012-06-05
      • 2016-11-01
      • 2014-04-25
      • 1970-01-01
      相关资源
      最近更新 更多