Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Outlook PowerShell脚本无法检索最新的电子邮件_Powershell_Outlook_Etl - Fatal编程技术网

Outlook PowerShell脚本无法检索最新的电子邮件

Outlook PowerShell脚本无法检索最新的电子邮件,powershell,outlook,etl,Powershell,Outlook,Etl,我有一个脚本,可以读取Outlook文件夹中的电子邮件,选择最近收到的电子邮件,并将其附件保存到目录中 它工作不正常-似乎只有在我运行脚本之前首先打开Outlook时它才知道要接收哪封电子邮件-否则,它认为最近收到的电子邮件是我上次打开Outlook时最后收到的电子邮件 在脚本提示扫描之前,是否有方法提示Outlook刷新 我的代码如下: $filepath=$args[0] $account=$args[1] #将outlook设置为打开 $o=新对象-comobject outlook.ap

我有一个脚本,可以读取Outlook文件夹中的电子邮件,选择最近收到的电子邮件,并将其附件保存到目录中

它工作不正常-似乎只有在我运行脚本之前首先打开Outlook时它才知道要接收哪封电子邮件-否则,它认为最近收到的电子邮件是我上次打开Outlook时最后收到的电子邮件

在脚本提示扫描之前,是否有方法提示Outlook刷新

我的代码如下:

$filepath=$args[0]
$account=$args[1]
#将outlook设置为打开
$o=新对象-comobject outlook.application
$n=$o.GetNamespace(“MAPI”)
$Account=$n.Folders |?{$\.Name-eq$account};
$Inbox=$Account.Folders |?{$\.Name-匹配“收件箱”};
$Data=$Inbox.Folders |?{$\.Name-匹配“数据”};
$f=$Data.Folders |?{$\.Name-匹配'MyTargetFolder'};
$email=$f.Items |排序对象接收时间-降序|选择对象-第一个1
#记录我们正在寻找的电子邮件,并提及附件(如果存在)。
写入输出“上次在$($email.receivedtime)收到的电子邮件,所附文件为:(如果有)
$email.attachments |%{写入输出$|.filename}
#如果电子邮件至少有一个附件,请将其保存到文件路径。
如果($email.attachments.count-gt 0){
$email.attachments |%{$\.saveasfile((连接路径$filepath$\.filename))}
}否则{
Write Output“位于$($email.receivedtime)的最新电子邮件没有附件!”
}

这是缓存(相对于在线)Exchange存储吗?尝试关闭缓存。

这是缓存的(相对于联机的)Exchange存储吗?尝试关闭缓存。

听起来您需要一个

$a.Store | ?{$_.DisplayName -eq $account} | %{If($_.IsCachedExchange){Start-Job {$n.SendAndReceive($false)}|Wait-Job}}
在那里,以确保如果它是在缓存模式,它将发送和接收之前检查电子邮件。请参见下面的编辑注释

您可能还希望确保用户未处于脱机模式,并且:

If($n.offline){write-host "You must be online before performing this script" -fore red;start-sleep 5;break}
这样,如果用户处于脱机模式,它将显示红色文本,说明他们需要处于联机模式,等待5秒钟,然后中断脚本


编辑:多亏了Adi Inbar,它将等待Outlook完成发送和接收过程,然后再继续,以确保在继续之前缓存了最新的电子邮件。谢谢阿迪,我不知道那个命令,它很方便

听起来你需要一个

$a.Store | ?{$_.DisplayName -eq $account} | %{If($_.IsCachedExchange){Start-Job {$n.SendAndReceive($false)}|Wait-Job}}
在那里,以确保如果它是在缓存模式,它将发送和接收之前检查电子邮件。请参见下面的编辑注释

您可能还希望确保用户未处于脱机模式,并且:

If($n.offline){write-host "You must be online before performing this script" -fore red;start-sleep 5;break}
这样,如果用户处于脱机模式,它将显示红色文本,说明他们需要处于联机模式,等待5秒钟,然后中断脚本


编辑:多亏了Adi Inbar,它将等待Outlook完成发送和接收过程,然后再继续,以确保在继续之前缓存了最新的电子邮件。谢谢阿迪,我不知道那个命令,它很方便

贡献+1。不,它是在线的。但是,我进入了Outlook选项并更改了发送/接收设置,以便在Outlook脱机时每15分钟安排一次自动发送/接收。我不确定这是否有用。我仍然希望找到一种通过编程实现这一点的方法,因为我希望任何人都能够通过计划程序启动此高级脚本,而无需更改其Outlook设置。您可以使用Namespace.sendandereceive或Namespace.SyncObjects集合启动同步,但它将是异步的。那么它是什么样的消息存储呢?如果是Exchange,为什么需要发送/接收设置?消息由服务器接收,而不是本地存储。如果您使用的是在线模式,它甚至不存在。我的Outlook/Exchange词汇表/知识非常有限,请耐心等待。它是一个Exchange邮件存储。你说得对-当我查看服务器设置时,甚至无法选择“使用缓存的Exchange模式”。我不确定/仍然不确定我看到的Outlook内容是如何存储的-你是说它们都驻留在服务器上吗?还是复制到我的电脑上?我注意到,单击“发送/接收”有时会将新项目推送到我的收件箱。您的意思是“使用缓存的Exchange模式”复选框未选中并被禁用?如果未选中,则所有消息都存储在服务器上。如果选中此选项,则邮件仍在服务器上,但Outlook使用Exchange存储提供程序定期与服务器同步的本地存储(OST)。配置文件中是否也有POP3/SMTP帐户?是的,未选中并禁用该帐户。我在个人资料中没有POP3/SMTP帐户。+1用于贡献。不,它是在线的。但是,我进入了Outlook选项并更改了发送/接收设置,以便在Outlook脱机时每15分钟安排一次自动发送/接收。我不确定这是否有用。我仍然希望找到一种通过编程实现这一点的方法,因为我希望任何人都能够通过计划程序启动此高级脚本,而无需更改其Outlook设置。您可以使用Namespace.sendandereceive或Namespace.SyncObjects集合启动同步,但它将是异步的。那么它是什么样的消息存储呢?如果是Exchange,为什么需要发送/接收设置?消息由服务器接收,而不是本地存储。如果您使用的是在线模式,它甚至不存在。我的Outlook/Exchange词汇表/知识非常有限,请耐心等待。它是一个Exchange邮件存储。你说得对-当我查看服务器设置时,甚至无法选择“使用缓存的Exchange模式”。我不确定/仍然不确定我看到的Outlook内容是如何存储的-你是说它们都驻留在服务器上吗?还是复制到我的电脑上?我注意到,单击“发送/接收”有时会将新项目推送到我的收件箱。您的意思是“使用缓存的Exchange模式”复选框未选中并被禁用?如果未选中,则所有消息都存储在服务器上。如果是