【问题标题】:PowerShell return list of PST folders and number of emails in eachPowerShell 返回 PST 文件夹列表和每个文件夹中的电子邮件数量
【发布时间】:2018-02-17 20:00:13
【问题描述】:

我正在尝试运行一个 PowerShell 脚本,该脚本会打开 Outlook PST,并列出所有目录以及每个目录中的电子邮件数量。当我第一次尝试时,它运行良好,但当我修改脚本时它最终崩溃了。

此时,即使我恢复到原始脚本,我也无法让它工作。问题似乎是当脚本尝试设置 $PST(附件的第 56 行)时,它为空。然后我收到一条错误消息,指出由于空值表达式而存在问题。

 You cannot call a method on a null-valued expression.
 At H:\users\michael\my documents\~mga outlook pst email\PST Number of Emails.pst:53 char:27
 + $root = $PST.GetRootFolder <<<< <>
      + CategiryUbfi             : InvalidOperation: (GetRootFolder:String) [], RuntimeException
      + FullyQualifiedErrorId : InvokeMethodOnNull

代码可以看这里:https://pastebin.com/embed_js/hGDZwhDd这是https://gallery.technet.microsoft.com/office/Count-number-of-emails-in-61a2748e的轻微增强

我认为问题在于下面的行没有产生所需的值:

 $PST = $objnamespace.stores | ? { $_.FilePath -eq $strPSTPath }
 }

如果我知道 $PST 应该是什么,我可以将其硬编码为临时修复,但我不知道代码试图做什么。 $PST 是变量还是对象?

可能相关也可能不相关的是,在运行脚本几次后,会出现几个新文件,并带有 PST 文件名的变体。如果只是删除,脚本会挂在较早的位置。为了阻止脚本查找这些文件,我告诉 Outlook 名称与基本 PST 文件相同。这似乎可行,但同样出现“$PST 为空”相关错误。

如何修复/破解?

【问题讨论】:

    标签: powershell outlook pst


    【解决方案1】:

    我发现有几行没有真正起作用,我建议对其进行更改。尽管如此,我还是更新了您的代码并将其粘贴到here。通过它并尝试运行它。请让我知道输出是什么。在我看来,您引用的 PST 文件不存在;)

    这是我为检查文件是否存在而更改的代码

    $FileExists = Test-Path $strPSTPath 
      if ($FileExists -eq $True) {
      Write-Host "PST Exists"
    }
    else {
      Write-Host "PST NOT FOUND! Press any key to continue ..."
      $null = $Host.UI.RawUI.ReadKey('NoEcho, IncludeKeyDown')
    }
    

    干杯, 斯坦尼斯拉夫

    【讨论】:

    • 当然,PST 文件是我拥有的。您必须将其更改为现有的。
    • 看起来您所做的主要非诊断/编辑更改是更改“ $PST = $objnamespace.stores | ? { $_.FilePath -eq $sT = $objnamespace.stores | Where- Object { $_.FilePath -eq $strPSTPath".. 你能对这行代码提供一些见解吗?此更改消除了致命错误,但脚本仅输出 3 个文件夹的信息,而不是我文件中的 100 个文件夹。如果您将 $strPSPPath 变量更改为您系统上的 PST,您将看到结果。 PST 文件中的每个文件夹都应该有一个输出行。
    • 我还注意到您删除了“#count items in PST Root $rootcount = $root.items.count”中的非注释行虽然现在似乎没有任何效果,我怀疑它将需要使脚本正常工作。感谢您的帮助。
    • 再看一遍,似乎很清楚 $PST 是一个对象,并且原始代码将对象设置为包含 PST 中的所有文件夹,并进一步表明更改?到“Where-Object”将 $PST 对象减少为仅包含 3 个目录(至少在我的情况下)。有谁知道原始代码应该做什么,为什么它现在不起作用(至少对我来说)?请注意,它曾经(对我而言)确实有效,但发生了一些变化,因此不再有效。
    • 附加信息:Stanislav 提供的脚本为某些 PST 文件返回一个 $PST 对象,但不为其他文件返回一个对象。我真的需要对原始脚本的“$PST = $objnamespace.stores | ? { $_.FilePath -eq $strPSTPath”语句有所了解。另外,我发现带有原始语句的脚本适用于某些 PST 文件而不适用于其他文件?
    猜你喜欢
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多