none
Script mit Ja und Nein Ausführen lassen. RRS feed

  • Frage

  • Hallo,

    Ich bin noch neu im PowerShell programmieren. Ich möchte mir ein Löschscript schreiben das bestimmte Dateien in einen Ordner löscht. Dazu möchte ich eine Abfrage mit "Ja" und "Nein" machen. 

    Dies klappt auch derzeit ganz gut. Problem ist das mir das Script die Dateien löscht EGAL ob ich JA/NEIN drücke.

    Leider habe ich noch nichts dazu gefunden oder habe es nicht gesehen da mir die Kenntnisse fehlen.

    Hier das LöschScript:

      

    $x = Get-ChildItem -path D:\testdaten\ -r| ?{$_.fullname -like "*\2016\*"}| SELECT FullName, CreationTime| Format-Table -AutoSize
    $y = Get-ChildItem -path D:\testdaten\ -r| ?{$_.fullname -like "*\2016\*"}
    $Textdatei= "D:\Testlog\gelöschte Daten.txt"
    $x| Out-File $Textdatei

    $Text = "Folgende Dateien werden gelöscht. Es wird eine Datei der zu löschenden Daten auf $Textdatei erstellt."
    Write-Output ""
    Write-Output $Text
    Write-Output $x
    Write-Output ""

    $wshshell = new-object -comobject wscript.shell
    $Antwort=$wshshell.popup("Wollen Sie diese Daten wirklich löschen?",0,"Löschung von Daten!",4)

    # Abfrage starten

    if ($Antwort-eq 6) #Fall "Ja" oder "Yes" gedrückt wurde...

    {
    # Hier kommt der code rein, für den Fall das "Ja" gedrückt wurde
    Write-Output "Daten werden nun gelöscht!"
    }
    else

    # Hier kommt der Code rein, für den Fall, dass "Nein" gedrückt wurde.
    Write-Output "Abbruch!! Daten sind nicht gelöscht worden!"
    }

    # Code-Ende


    #Remove-Item -recurse "D:\testdaten\*\2016\*"
    #Notepad $Textdatei

    Dank für eure Hilfe


    Montag, 5. März 2018 14:01

Antworten

  • $wshshell = new-object -comobject wscript.shell
    $Antwort=$wshshell.popup("Wollen Sie diese Daten wirklich löschen?",0,"Löschung von Daten!",4)

    $Antwort ist 6 bei "Ja" und 7 bei "Nein".

    So gesehen ist das hier korrekt:

    if ($Antwort-eq 6) #Fall "Ja" oder "Yes" gedrückt wurde...
    {
    Write-Output "Daten werden nun gelöscht!"
    }
    else
    {
    Write-Output "Abbruch!! Daten sind nicht gelöscht worden!"
    }

    Und bei mir tut das auch genau das, was es soll.

    Sieht Dein originäres Skript auch so aus oder steht da was anderes drin?

    Montag, 5. März 2018 15:43
  • Du kannst dir zwar deine eigene Abfrage schreiben, aber eigentlich kannst du dazu auch interne PowerShell-Funktionen verwenden. Das hat zudem den Charme, dass dein Script vom Look & Feel eher wie die mitgelieferten Cmdlets funktioniert.

    Das würde in etwa so aussehen:

    # Remove-FileWithConfirmation.ps1
    
    [CmdletBinding(SupportsShouldProcess=$true,ConfirmImpact='High')]
    Param
    (
        [Parameter(Mandatory=$true,Position=0)]
        [ValidateScript({Test-Path -Path $_})]
        [string[]]$Path
    )
    
    if ($PSCmdlet.ShouldProcess($Path, 'Remove File'))
    {
        Remove-Item -Path $Path
    }

    Damit gibt es den Parameter -WhatIf mit dem du prüfen kannst, welche Dateien gelöscht werden würden und ohne Angabe von Parametern erhälst du eine Abfrage: 

    PS > $TempFileName = [System.IO.Path]::GetTempFileName()
    
    PS > .\Remove-FileWithConfirmation.ps1 $TempFileName -WhatIf
    What if: Performing the operation "Remove File" on target "C:\Users\max.mustermann\AppData\Local\Temp\tmpB6BA.tmp".
    
    PS > .\Remove-FileWithConfirmation.ps1 $TempFileName
    
    Confirm
    Are you sure you want to perform this action?
    Performing the operation "Remove File" on target "C:\Users\max.mustermann\AppData\Local\Temp\tmpB6BA.tmp".
    [Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"): y




    Montag, 5. März 2018 19:57

Alle Antworten

  • Hallo,

    wenn etwas unerwartetes passiert, muss man seinen Code debuggen. Dafür kannst du verschieden vorgehen:

    • einen Haltepunkt auf "if($Antwort -eq 6)..." setzen. Das Skript ausführen und auf das Erreichen des Haltepunktes warten. Nachsehen, was der Wert in $Antwort ist.
    • Falls es gut aussieht: Danach eine Zeile weiterspringen und nachsehen, ob er richtig abbiegt. Die aktuelle Zeile ist gelb markiert.
    • Einzelne, markierte Zeilen oder Codebereiche mit F8 ausführen und überprüfen, ob sie das machen, was du erwartest.
    Montag, 5. März 2018 14:18
  • Das Script funktioniert im Grunde. Nur das es nicht unterscheidet zwischen ja und Nein.

    Ich denke eher das in diesem Bereich etwas fehlt wie z.B. remove-item -confirm:false. (Mit dem habe ich schon gearbeitet hat den gleichen Effekt.)

    Wenn das die Zeile für JA ist (if ($Antwort-eq 6) #Fall "Ja" oder "Yes" gedrückt wurde...)

    Wie lautet dann die Zeile für NEIN? 

    Sorry, für meine dussligen Fragen aber den Zusammenhang hab ich noch nicht verstanden?


    • Bearbeitet Gonzo734 Montag, 5. März 2018 14:43
    Montag, 5. März 2018 14:43
  • $wshshell = new-object -comobject wscript.shell
    $Antwort=$wshshell.popup("Wollen Sie diese Daten wirklich löschen?",0,"Löschung von Daten!",4)

    $Antwort ist 6 bei "Ja" und 7 bei "Nein".

    So gesehen ist das hier korrekt:

    if ($Antwort-eq 6) #Fall "Ja" oder "Yes" gedrückt wurde...
    {
    Write-Output "Daten werden nun gelöscht!"
    }
    else
    {
    Write-Output "Abbruch!! Daten sind nicht gelöscht worden!"
    }

    Und bei mir tut das auch genau das, was es soll.

    Sieht Dein originäres Skript auch so aus oder steht da was anderes drin?

    Montag, 5. März 2018 15:43
  • Du kannst dir zwar deine eigene Abfrage schreiben, aber eigentlich kannst du dazu auch interne PowerShell-Funktionen verwenden. Das hat zudem den Charme, dass dein Script vom Look & Feel eher wie die mitgelieferten Cmdlets funktioniert.

    Das würde in etwa so aussehen:

    # Remove-FileWithConfirmation.ps1
    
    [CmdletBinding(SupportsShouldProcess=$true,ConfirmImpact='High')]
    Param
    (
        [Parameter(Mandatory=$true,Position=0)]
        [ValidateScript({Test-Path -Path $_})]
        [string[]]$Path
    )
    
    if ($PSCmdlet.ShouldProcess($Path, 'Remove File'))
    {
        Remove-Item -Path $Path
    }

    Damit gibt es den Parameter -WhatIf mit dem du prüfen kannst, welche Dateien gelöscht werden würden und ohne Angabe von Parametern erhälst du eine Abfrage: 

    PS > $TempFileName = [System.IO.Path]::GetTempFileName()
    
    PS > .\Remove-FileWithConfirmation.ps1 $TempFileName -WhatIf
    What if: Performing the operation "Remove File" on target "C:\Users\max.mustermann\AppData\Local\Temp\tmpB6BA.tmp".
    
    PS > .\Remove-FileWithConfirmation.ps1 $TempFileName
    
    Confirm
    Are you sure you want to perform this action?
    Performing the operation "Remove File" on target "C:\Users\max.mustermann\AppData\Local\Temp\tmpB6BA.tmp".
    [Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"): y




    Montag, 5. März 2018 19:57
  • > Du kannst dir zwar deine eigene Abfrage schreiben, aber eigentlich kannst du dazu auch interne PowerShell-Funktionen verwenden. Das hat zudem den Charme, dass dein Script vom Look & Feel eher wie die mitgelieferten Cmdlets funktioniert.

    Das ist aber von 0 auf 100 in 2 Sekunden :-))

    Dienstag, 6. März 2018 10:06
  • OK, vielen dank für die ausführlichen Antworten.

    Ich denke das hilft mir ein Stückchen weiter.

    Gruß

    Gonzo

    Dienstag, 6. März 2018 12:52