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-ID: 543930

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

Ausgedruckt am: 22.11.2024 um 12:11 Uhr

erikro
erikro 05.02.2020 aktualisiert um 11:35:19 Uhr
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
142232
142232 05.02.2020 aktualisiert um 11:45:37 Uhr
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.
erikro
Lösung erikro 05.02.2020 um 11:41:05 Uhr
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