Domanda

We tend to drag and drop messages from outlook into Windows Explorer so I need to rename the default message filename so that the files are searchable/readable from Explorer.

I have managed to put together the following code that almost renames an outlook file on a network folder from the default "Subject.msg" to "To - Subject - ReceivedDate - hhmmss.msg". The only problem is that the rename step does not work as I believe the Outlook process is locking the file. I would appreciate help to avoid the locking and rename the files? Also, I am not sure what happens if there are multiple people in the To list, I would be happy to take the first name in the To list? Here is my effort:

$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
    }

p.s. [Inserted @ 18 Jun 2013] In answer to Athom, I know Outlook is locking the file as I get the following error:

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

However, when I close outlook (which is initiated by the powershell script), I can then run the Rename-Item command and it run's successfully.

È stato utile?

Soluzione

How's this?

Essentially the changes I have mades are:

  • Your renaming loop now throws its output to a hashtable.
  • Stop-Process kills Outlook.
  • Another loop then does the renaming.

        # 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
        }
    
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top