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
Fehler:
Danke vorab für schnelle Hilfe!
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!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 543930
Url: https://administrator.de/contentid/543930
Ausgedruckt am: 22.11.2024 um 12:11 Uhr
3 Kommentare
Neuester Kommentar
Moin,
Die Datei ist geöffnet, da Du sie ja gerade als Anhang verschickst. Versuche mal
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
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
Eben, die Ressourcen musst du erst wieder freigeben, dagegen hilft ein
nach dem Versenden. Am besten packt man das ganze in ein Try-Catch-FInally Konstrukt.
$Mail_Att.Dispose()
$Mail_Msg.Dispose()
[gc]::Collect()
Zitat von @142232:
Eben, dagegen hilft ein
nach dem Versenden. Am besten packt man das ganze in einn Try-Catch-FInally Konstrukt.
Eben, dagegen hilft ein
> $Mail_Msg.Dispose()
> $Mail_Att.Dispose()
>
Aha. Wieder was gelernt.