robdox
Goto Top

Rename-Item, kein Zugriff auf Datei

Hallo zusammen,

in meinem Powershellskript lese ich bestimmte Dateien aus und verschicke diese per E-Mail (als Funktion). Wenn diese E-Mail verschickt wird möchte ich danach die verschickten Dateien umbenennen. Hier liefert mit Powershell immer zurück, dass die Datei gerade verwendet wird. Diese wird aber nicht verwendet sondern liegt im Ordner unangefasst. Hier der Codeschnipsel

....
SQL Befehle
....
function querySQL {
    Param(
        [string]$cSQL
    )
    # Connectionstring aus m3.config
    $connectionString = "Data Source=EXNER-DRMALEK\m3db; Initial Catalog=drmxdb2_TBL; user id=sa; pwd=Drmalek_123"  

    # SQL Verbindung aufbauen
    $connection            = New-Object system.data.SqlClient.SQLConnection($connectionString)
    $command               = New-Object system.data.sqlclient.sqlcommand($cSQL,$connection)
    $connection.Open()
    $adapter               = New-Object System.Data.sqlclient.sqlDataAdapter $command
    $dataset               = New-Object System.Data.DataSet
    
    # Tabelle erstellen
    $adapter.Fill($dataSet) | Out-Null
    $connection.Close()
    $dataSet.Tables
}

function CMR_Mail($Mail, $body, $Mail_File) {
      
     #Mailobjekt erzeugen
     $Mail_Host           = New-Object system.net.mail.smtpClient
     $Mail_Msg            = New-Object system.net.mail.mailmessage
     $Mail_Att            = New-object Net.Mail.Attachment($Mail_File)

     #E-Mail Anhang               
     $Mail_Msg.Attachments.Add($Mail_Att)

     #Server
     $Mail_Host.Host      = "xxxx"  
     $Mail_Msg.from       = "xxxx"   

     $Mail_Msg.To.add($Mail)

     #Betreff formatieren
     $Betreff=$Mail_File.BaseName.replace("(LIST)","")  
     
     #Bereitstellen
     $Mail_Msg.Subject = “CMR: " + $Betreff.substring("","9") + " gesendet am " + ([datetime]::now).tostring("dd.MM.yyyy")   
   
     #Format
     $Mail_Msg.IsBodyHtml = $false
     $Mail_Msg.Body       = $body

     #Versenden
     $Mail_Host.Send($Mail_Msg) 
}

# SQL Werte auslesen und entsprechende Dateien in Ordner verschieben
[array]$result = (querySQL -cSQL $vCommand).Nr_ListeA

# E-Mail vom AG auslesen, und jede einzelne E-Mail
[array]$Adresse = (querySQL -cSQL $vCMD_Mail).Wert

#array]$Adresse = $result_mail.split(";")  

# Textinhalt abhängig von Sprache
[array]$vText=(querySQL -cSQL $vCMD_LAND).Text

# Leerzeichen weg
#$Adresse=$Adresse.TrimStart();
#$Adresse=$Adresse.TrimEnd();

# Liste aller Dateien durchsuchen
[array]$files = Get-ChildItem -Path $vPfad -Include "(LIST)*.pdf" -Recurse  | Where-Object -FilterScript {($_.LastWriteTime -gt $Zeitraum)}  

#Pattern für REGEX-Match vorbereiten
$pattern = ($result | %{[regex]::escape($_)}) -join "|"   

# Gefundene Dateien für Agenten bereitstellen

        foreach($f in $files)
        {
          for($i=0; $i -lt $Adresse.Length; $i++)
          {
             if($f.Basename -match $pattern)
             {
                switch($Adresse[$i]) #Sprache ermitteln und entsprechend Text (Standardtexte)
                   { 
                     {$_ -like '*.de'} {  
                                        if($f.BaseName -notlike '*EMAIL*') #Falls Datei noch nicht umbenannt  
                                        {
                                            CMR_Mail $Adresse[$i] $vText $f; #Mail versenden (das klappt)
                                            rename-item -Force -Path $f.FullName -NewName ($f.Name -replace "LIST","LIST_EMAIL") #und die versendete Datei umbenennen, klappt nicht.  
                                        }
                             
                                      }            
                       #     {$_ -like '*.it'} { CMR_Mail $Adresse[$i] $vText[1] $files[$x]}  
                       #     {$_ -like '*.cz'} { CMR_Mail $Adresse[$i] $vText[2] $files[$x]}  
                       #     {$_ -like '*.uk*'} { CMR_Mail $Adresse[$i] $vText[3] $files[$x]]}  
                   }                  
              }
              else { break }
           }
        }

Fehler:
rename-item : Der Prozess kann nicht auf die Datei zugreifen, da sie bereits von einem anderen Prozess verwendet wird. <-- Warum? 
In .. CMR2.ps1:132 Zeichen:45
+ ...             rename-item -Force -Path $f.FullName -NewName ($f.Name -r ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : WriteError: (RK2001010.pdf:String) [Rename-Item], IOException
    + FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand


Danke vorab für schnelle Hilfe!

Content-Key: 543930

Url: https://administrator.de/contentid/543930

Printed on: April 18, 2024 at 20:04 o'clock

Member: erikro
erikro Feb 05, 2020 updated at 10:35:19 (UTC)
Goto Top
Moin,

Zitat von @robdox:
>         CMR_Mail $Adresse[$i] $vText $f; #Mail versenden (das klappt)
>         rename-item -Force -Path $f.FullName -NewName ($f.Name -replace "LIST","LIST_EMAIL") #und die versendete Datei umbenennen, klappt nicht.  
> 

Die Datei ist geöffnet, da Du sie ja gerade als Anhang verschickst. Versuche mal

start-sleep 30

zwischen den beiden Befehlen. Keine Ahnung, ob das lang genug ist oder zu lang. Das kommt auf die Größe der Dateien an, die da verschickt werden. Auf jeden Fall muss das Versenden abgeschlossen sein, bevor der lock wieder entfernt wird.

hth

Erik
Mitglied: 142232
142232 Feb 05, 2020 updated at 10:45:37 (UTC)
Goto Top
Zitat von @erikro:
Die Datei ist geöffnet, da Du sie ja gerade als Anhang verschickst. Versuche mal
Eben, die Ressourcen musst du erst wieder freigeben, dagegen hilft ein
$Mail_Att.Dispose()
$Mail_Msg.Dispose()
[gc]::Collect()
nach dem Versenden. Am besten packt man das ganze in ein Try-Catch-FInally Konstrukt.
Member: erikro
Solution erikro Feb 05, 2020 at 10:41:05 (UTC)
Goto Top
Zitat von @142232:

Zitat von @erikro:
Die Datei ist geöffnet, da Du sie ja gerade als Anhang verschickst. Versuche mal
Eben, dagegen hilft ein
> $Mail_Msg.Dispose()
> $Mail_Att.Dispose()
> 
nach dem Versenden. Am besten packt man das ganze in einn Try-Catch-FInally Konstrukt.

Aha. Wieder was gelernt. face-smile