none
Ordnerstruktur per Script loeschen, welches in der Ordnerstruktur enthalten ist RRS feed

  • Frage

  • Hi,

    ich habe einen Ordner C:\Test. In diesem Ordner liegt ein Powershellscript mit dem man den Ordner C:\Test mit allen Dateien und Unterordnern löschen kann. Mir ist bewusst das man den Ordner nicht löschen kann da das Script darin ausgeführt wird.

    Also hab ich mir gedacht, dass wenn ich in dem Script auf löschen Drücke, ein zweites Script und eine Verknüpfung die dieses Script aufruft, in den Ordner C:\temp kopiert wird und in dem vorherigen Script diese Verknüpfung aufgerufen wird und sich das erste Script beendet.

    In dem Script welches nun über die Verknüpfung auf C:\temp aufgerufen wird, wird der Ordner C:\Test gelöscht.

    Es zeigt aber trotzdem noch an das der Ordner nicht gelöscht werden kann, da er noch verwendet wird...

    Hoffe ich hab es nicht zu kompliziert geschrieben...

    Hier mein Code:

    Copy-Item C:\Test\Deinstallationsscript.ps1 C:\temp
    Copy-Item C:\Test\Deinstallation.lnk C:\temp
    	
    start C:\temp\Deinstallation.lnk
    
    $Erstes_Script.close()

    Die 2 Dateien werden auch einwandfrei kopiert

    start-sleep -seconds 5
    
    Remove-Item C:\Pflegemenü_Data -Force -Recurse 

    Ich habe sogar eine 5 Sekundenpause eingefügt damit sich das erste Script richtig beenden kann und trotzdem funktioniert es nicht...

    Danke für eure Hilfe und einen schönen Feierabend :)

    MfG McMaggi



    • Bearbeitet MCMaggi Montag, 19. September 2016 13:42
    Montag, 19. September 2016 13:42

Antworten

  • Du brauchst kein zweites Script.
    Powershell Scripte werden in den Speicher geladen und laufen dort. Du kannst das Script File einfach von seinem eigenen Code aus Löschen. Das Script läuft trotzdem weiter.
     
     
    Grüße, Denniver

    Blog: http://bytecookie.wordpress.com

    Neu: Powershell Code Manager v5 ! Link
    (Schneller, besser + komfortabler scripten.)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Montag, 19. September 2016 14:05
    Moderator
  • Moin,

    Denniver hat natürlich recht, ABER: Du musst natürlich irgendwie zu dem Skript kommen, um es aufzurufen! Und wenn Du das per Explorer tust, dann ist es das offene Explorer-Fenster, das das Löschen verhindert und nicht das ausgeführte Skript :-)

    Gerade getestet:

    Remove-Item (Get-Item $PSScriptRoot).FullName -Recurse

    funktioniert, wenn man es per powershell c:\tempt\testfolder\deltest.ps1 aufruft, nicht aber, wenn man dahin browst und mit der rechten Maustaste drauf klickt.


    Evgenij Smirnov

    msg services ag, Berlin -> http://www.msg-services.de
    my personal blog (mostly German) -> http://it-pro-berlin.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    In theory, there is no difference between theory and practice. In practice, there is.


    • Bearbeitet Evgenij Smirnov Montag, 19. September 2016 14:45
    • Als Antwort markiert MCMaggi Dienstag, 20. September 2016 05:40
    Montag, 19. September 2016 14:44

Alle Antworten

  • Du brauchst kein zweites Script.
    Powershell Scripte werden in den Speicher geladen und laufen dort. Du kannst das Script File einfach von seinem eigenen Code aus Löschen. Das Script läuft trotzdem weiter.
     
     
    Grüße, Denniver

    Blog: http://bytecookie.wordpress.com

    Neu: Powershell Code Manager v5 ! Link
    (Schneller, besser + komfortabler scripten.)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Montag, 19. September 2016 14:05
    Moderator
  • Moin,

    Denniver hat natürlich recht, ABER: Du musst natürlich irgendwie zu dem Skript kommen, um es aufzurufen! Und wenn Du das per Explorer tust, dann ist es das offene Explorer-Fenster, das das Löschen verhindert und nicht das ausgeführte Skript :-)

    Gerade getestet:

    Remove-Item (Get-Item $PSScriptRoot).FullName -Recurse

    funktioniert, wenn man es per powershell c:\tempt\testfolder\deltest.ps1 aufruft, nicht aber, wenn man dahin browst und mit der rechten Maustaste drauf klickt.


    Evgenij Smirnov

    msg services ag, Berlin -> http://www.msg-services.de
    my personal blog (mostly German) -> http://it-pro-berlin.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    In theory, there is no difference between theory and practice. In practice, there is.


    • Bearbeitet Evgenij Smirnov Montag, 19. September 2016 14:45
    • Als Antwort markiert MCMaggi Dienstag, 20. September 2016 05:40
    Montag, 19. September 2016 14:44
  • Also wenn du es wirklich per Hand aufrufst, kannst du es auch per Hand löschen. Oder gleich -was viel cleverer wäre- einfach nicht in dem zu löschenden Verzeichnis spreichern. :)

    Also ich denke es geht hier um irgendwas automatisch ablaufendes...


    Blog: http://bytecookie.wordpress.com

    Neu: Powershell Code Manager v5 ! Link
    (Schneller, besser + komfortabler scripten.)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.



    Montag, 19. September 2016 14:53
    Moderator
  • Also wenn du es wirklich per Hand aufrufst,

    Naja, die .lnk im ersten Snippet läßt doch zumindest den Verdacht aufkommen ;-)

    Evgenij Smirnov

    msg services ag, Berlin -> http://www.msg-services.de
    my personal blog (mostly German) -> http://it-pro-berlin.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    In theory, there is no difference between theory and practice. In practice, there is.

    Montag, 19. September 2016 14:55
  • > Naja, die .lnk im ersten Snippet läßt doch zumindest den Verdacht
    > aufkommen ;-)
     
    ...und zerstört den auch gleich wieder :-))
    "start C:\temp\Deinstallation.lnk"
     
    Ich gehe auch davon aus, daß Working Directory das Problem ist, entweder
    im Explorer oder in irgendeiner Shell.
     
    Montag, 19. September 2016 15:49
  • Moin,

    danke für die Hilfe :)

    ich dachte mir schon das es auch anders geht , aber rein von meiner Logik dachte ich das das auch mit einem zweiten Script funktionieren würde :D

    danke und guten Tag :)

    MfG McMaggi

    Dienstag, 20. September 2016 05:43
  • Du kannst auch mit einem zweiten Skript den Inhalt des Löschskriptes als Text auslesen (Get-Content) und den Text dann als Code ausführen (Invoke-Expression).
    Dienstag, 20. September 2016 05:59
  • Kann ich dann die Datei in welcher der Text des Löschskriptes steht in den zu löschenden Ordner speichern und auslesen?

    oder funktioniert das dann wieder nicht?

    Dienstag, 20. September 2016 07:19
  • Ich glaube ich habe mein Problem nicht genau genug erklärt. Ich rufe per Verknüpfung auf dem Desktop ein Skript im Ordner C:\testordner auf. Dieses Script enthält einen Button 'löschen'. Per Klick auf diesen Button möchte ich das sich der Ordner in dem das Script liegt löscht und das Script sich anschließend schließt bzw. erst schließt und dann löscht je nachdem wie es am einfachsten geht.

    Danke für eure Hilfe :)

    Grüße

    Dienstag, 20. September 2016 07:27
  • Kannst du. Get-Content liest das Skript als Textdatei ein und hat danach keine weitere Verbindung zu der Datei. Du kannst sie also löschen. Das Skript ist dann im Hauptspeicher als Text verfügbar (in der Variablen). 

    Was aber nicht gehen wird, ist dass du mit der Verknüpfung das Skript aufrufst, dass du löschen willst. Sowas musst du irgendwie basteln, vielleicht mit temporären Skripten und einer temporären Verknüpfung.

    Aber ehrlich, warum willst du sowas?

    Dienstag, 20. September 2016 08:58
  • Es ist für eine Art "Programm" damit wenn man das nicht mehr will einfach löschen kann ohne den Ordner zu suchen. Das war ja nur ein ein Beispiel mit dem C:\Testordner. Es sind mehrere Ordner und dann hab ich gedacht wenn man das "Programm" nicht mehr nutzt, klickt man einfach auf den Button und die Ordner werden alle von alleine gelöscht ohne das der Benutzer etwas tun muss.

    Trotzdem danke für eure Hilfe :)

    Grüße

    Dienstag, 20. September 2016 09:40
  • Aha, ein sich selbst aufräumendes Programm. Find ich gut. Üblicherweise macht man das über einen Installer und seine Deinstallationsroutine. :)
    Aber wenn du einen Weg findest den offenen Explorer-Handle auf die Datei programatisch zu schliessen, was grundsätzlich irgendwie gehen sollte, dann sollte dein Weg auch gehen, ohne zweites Script. Die Frage ist nur, lohnt sich der Aufwand oder hast du nicht in der gleichen Zeit einen Installer gebastelt? :)
     
    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Neu: Powershell Code Manager v5 ! Link
    (Schneller, besser + komfortabler scripten.)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.



    Dienstag, 20. September 2016 13:07
    Moderator
  • Genau das habe ich getan :D

    Nur das der Installer in dem Ordner liegt^^

    Ich habe ihn jetzt in jetzt außerhalb des Programmordners gespeichert.

    Würde mich dennoch interessieren ob es nicht noch anders geht :)

    Danke für eure Hilfe

    Grüße

    Donnerstag, 29. September 2016 08:36
  • > Würde mich dennoch interessieren ob es nicht noch anders geht :)
     
    Mit dem Holzhammer, ja: Ermittle Dein Arbeitsverzeichnis, und wenn es
    das ist, das Du löschen willst, kopiere Dich selbst nach %TEMP% und rufe
    Dich dort erneut auf - asynchron in einem neuen Prozess :)
     
    Oder schreib das Verzeichnis, das Du löschen willst, in die
    pendingfilerenameoperations und boote neu :D
     
    Donnerstag, 29. September 2016 09:17
  • Ok. dann bleib ich dabei das man das manuell aufrufen muss :)

    ich dachte nur weil  es ja mit anderen programmen auch funktioniert...

    Danke für die Hilfe :)

    Grüße

    Donnerstag, 29. September 2016 10:55