【问题标题】:Renaming .msg files using Powershell使用 Powershell 重命名 .msg 文件
【发布时间】:2013-06-17 19:00:20
【问题描述】:

我们倾向于将消息从 Outlook 拖放到 Windows 资源管理器中,因此我需要重命名默认消息文件名,以便可以从资源管理器中搜索/读取文件。

我设法将以下代码组合在一起,几乎将网络文件夹上的 Outlook 文件从默认的“Subject.msg”重命名为“To - Subject - ReceivedDate - hhmmss.msg”。唯一的问题是重命名步骤不起作用,因为我相信 Outlook 进程正在锁定文件。我会很感激帮助避免锁定和重命名文件?另外,我不确定如果收件人列表中有多个人会发生什么,我很乐意在收件人列表中取第一个名字?这是我的努力:

$olMailItemPath = "W:\Marketing\Prospects\Emails\*"
Write-Host $olMailItemPath

$SourceFiles = Get-Item -path $olMailItemPath -include *.msg
$outlook = New-Object -comobject outlook.application
$namespace = $outlook.GetNamespace("MAPI")

function cleanName($aname)
{
    $aname = $aname -replace "'"
    $aname = $aname -replace ":"
    $aname = $aname -replace "@"
    $aname = $aname -replace "-"
    return ($aname.trim())
}

function cleanSubject($subject)
{
    $subject = $subject -replace 'Re:'
    $subject = $subject
    return (' - ' + $subject.trim() + ' - ')
}


foreach ($msg in $SourceFiles){
    $olMailItem = $NameSpace.OpenSharedItem($msg)
    $EmailTo = $olMailItem.To
    $EmailSubject = $olMailItem.Subject
    $DateRecieved = $olMailItem.ReceivedTime
    $newfilename = (cleanName($EmailTo)) + (cleanSubject($EmailSubject)) + $DateRecieved.ToString("yyyyMMdd - hhmmss") + ".msg"

    # Write-Host "Email Sent To: $EmailTo "
    # Write-Host "Subject: $EmailSubject "   
    # Write-Host "Date Recieved: $DateRecieved"    

    Write-Host $msg    
    Write-Host $newfilename
    Rename-Item $msg $newfilename
    }

附言[插入 @ 2013 年 6 月 18 日] 在回答 Athom 时,我知道 Outlook 正在锁定文件,因为我收到以下错误:

Rename-Item : The process cannot access the file because it is being used by another process.
At C:\Users\Bertie\Dropbox\Programming\Powershell\Rename Outlook Messages.ps1:41 char:16
+     Rename-Item <<<<  -path $msg -newname $newFileName
    + CategoryInfo          : WriteError: W:\Marketing\Prospects\Emails\new.msg:String) [Rename-Item], IOException
    + FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand

但是,当我关闭 Outlook(由 powershell 脚本启动)时,我可以运行 Rename-Item 命令并成功运行。

【问题讨论】:

  • 是什么让你相信进程锁定了文件?错误?重命名这些时它运行的是 Outlook 还是 OE?
  • 亲爱的 Athom,我已编辑我的问题以向您提供错误消息。我知道它被 Outlook 锁定了,因为当我关闭 Outlook 时,我可以重命名该文件。

标签: powershell windows-7 outlook powershell-2.0 msg


【解决方案1】:

这是怎么回事?

基本上我所做的更改是:

  • 您的重命名循环现在将其输出抛出到哈希表。
  • Stop-Process 会杀死 Outlook。
  • 然后另一个循环进行重命名。

        # Declare the hastable to store the names, then generate the names.
        $nameHash = @{}; Foreach ($msg in $SourceFiles){
            # Do the Outlook thing
            $olMailItem = $NameSpace.OpenSharedItem($msg)
            $EmailTo = $olMailItem.To
            $EmailSubject = $olMailItem.Subject
            $DateRecieved = $olMailItem.ReceivedTime
    
            $newfilename = (cleanName($EmailTo)) + (cleanSubject($EmailSubject)) + $DateRecieved.ToString("yyyyMMdd - hhmmss") + ".msg"
    
            # Write-Host "Email Sent To: $EmailTo "
            # Write-Host "Subject: $EmailSubject "   
            # Write-Host "Date Recieved: $DateRecieved"    
    
            # Store the names
            $nameHash.Add("$msg","$newfilename")
        }
    
        # Kill Outlook.. Then wait....
        Stop-Process -Name Outlook -Force
        Start-Sleep -m 500 # You might be able to remove this - depends how beefy your CPU is.
    
        # Rename 
        ForEach ($item in $nameHash.GetEnumerator()) {
            # Testing >>-->
            echo $item.Name
            echo $item.Value
            # <--<< Testing
    
            Rename-Item $item.Name $item.Value
        }
    

【讨论】:

  • 谢谢安迪。你的调整成功了!显然,有一种方法可以直接从 Exchange 2007 导出,但是,它看起来有点繁琐(我只看到导出到 .pst,但谁知道呢,也许可以将单个邮件项导出到 .msg 而不是 .pst)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-31
  • 2021-08-27
  • 2015-11-26
  • 1970-01-01
  • 2014-03-03
  • 1970-01-01
  • 2023-03-03
相关资源
最近更新 更多