Jump to content

Zweiten Befehl im Script erst ausführen wenn der Erste abgearbeitet wurde


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Geschrieben

Moin moin,

 

ich hätte da mal ne Frage, da ich bei meiner Suche im Internet bis jetzt erfolglos war.

Und zwar möchte ich das ein Befehl im Script erst ausführt wird wenn Befehl davor komplett abgearbeitet wurde.
Ich möchte ein Datei zippen und im Anschluss diese Datei löschen. Da die Datei 3,7GB groß ist bekomme ich halt aktuell immer einen Fehler, dass er die Datei nicht löschen kann, da sie noch im Zugriff ist.

 

Hat jemand vielleicht ne Idee wie ich das lösen könnte?
 

 

 

Geschrieben

Macht es das nicht standardmäßig?

 

Wie sieht denn dein Script aus? Kann es sein, dass dein Zip Tool einen Fehler bei solch einer großen Datei bringt, im Script zurückkehrt aber die Datei noch im Zugriff hat? Oder kommt der Fehler sofort nach dem starten des Zippens?

Geschrieben

copy-ToZip -file ($($destination[$i])+"\"+$temp) -zipfile (($($destination[$i])+"\"+$temp)+".zip"); Remove-Item ($($destination[$i])+"\"+$temp)

Wenn ich Remove-Item weglasse funktioniert es, mit Remove-Item kommt dann die Meldung das die Datei im Zugriff ist.

Wenn die Datei kleiner ist und das zippen schneller geht funktioniert es. Ich denke das bei Remove-Item es eine bestimmte Zeit probiert und wenn es bis dahin nicht klappt gibt es die Fehlermeldung.

 

Sorry hatte vergessen zur erwähnen das es sich um PowerShell handelt.

Geschrieben

Standardmäßig wird die 2. Zeile (nach dem Strichpunkt) erst ausgeführt wenn die erste Zeile fertig ist.

 

Das kannst du mit

Start-Sleep 3 ; "Foo"

nachvollziehen.

 

Ist das Zip wirklich gezippt? Funktioniert copy-tozip?

Geschrieben

Nein. Führe nur mein Beispielscript aus, dann siehst du, dass die Zeile nacheinander ausgeführt wird. (hat jetzt nichts spezielles mit deinem Problem zu tun)

 

Ändere dein Script mal so:

 

copy-ToZip -file ($($destination[$i])+"\"+$temp) -zipfile (($($destination[$i])+"\"+$temp)+".zip")if($?){   Remove-Item ($($destination[$i])+"\"+$temp)}else{      "Fehler"}

Geschrieben

@Duckel Das ist jetzt mein Script mit der Pause was funktioniert.

 

import-module filesystem
$source = "C:\Zend\Apache2\htdocs\var\log\exception.log", "C:\Zend\Apache2\htdocs\var\log\system.log"
$destination = "c:\Log\exception", "c:\Log\system"
$file        = "exception.log", "system.log"

for ($i=0; $i -lt 2; $i++)
{
Copy-Item $source[$i] $destination[$i]
$temp= "$(Get-Date -f yyyyMMdd)_$($file[$i])"
rename-item ($destination[$i]+"\"+$file[$i]) $temp
copy-ToZip -file ($($destination[$i])+"\"+$temp) -zipfile (($($destination[$i])+"\"+$temp)+".zip") ; Start-Sleep 30
Remove-Item ($($destination[$i])+"\"+$temp)
}

Wenn ich dich richtig verstanden hatte sollte mein Script nach deinen Vorschlag nun so aussehen:

 

import-module filesystem
$source = "C:\Zend\Apache2\htdocs\var\log\exception.log", "C:\Zend\Apache2\htdocs\var\log\system.log"
$destination = "c:\Log\exception", "c:\Log\system"
$file        = "exception.log", "system.log"

for ($i=0; $i -lt 2; $i++)
{
Copy-Item $source[$i] $destination[$i]
$temp= "$(Get-Date -f yyyyMMdd)_$($file[$i])"
rename-item ($destination[$i]+"\"+$file[$i]) $temp
copy-ToZip -file ($($destination[$i])+"\"+$temp) -zipfile (($($destination[$i])+"\"+$temp)+".zip")
if($?){ 
Remove-Item ($($destination[$i])+"\"+$temp)
}else{
      "Fehler" 
}
}

 

Da kommt es dann aber zur besagten Fehlermeldung:
Remove-Item :Das Element C:\Log\system\20130522_system.log kann nicht entfernt werden: Der Prozess kann nicht auf die Datei "C:\Log\system\20130522_system.log" zugreifen, da sie von einem anderen Prozess verwendet wird.

 

Hab ich dich jetzt noch irgendeinen Fehler drin den ich grad nicht seh?

Geschrieben

Hallo,
du kannst auch WaitForExit einsetzen

 

$Notepad = Get-Process $ProcessName -ComputerName $ComputerName
$Notepad.WaitForExit()
"Notepad wurde am {0} beendet" -f $(Get-Date)
"Jetzt gehts weiter"

 

blub

Geschrieben

Wird dann nur hässlich da der TO kein Programm sondern ein cmdlet ausführen möchte.

Da müsste er Powershell mit dem Scriptteil starten (oder einen anderen Zipper verwenden).

 

An Start-Process -wait hatte ich auch schon gedacht.

Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...