none
Powershell RRS feed

  • Frage

  • Hallo,

    in Sachen Powershel bin ich ein absoluter Neuling. Ich hoffe man kann mir helfen oder auch einen Denkanstoss geben.

    Ich möchte gerne prüfen ob ein Programm läuft, wenn ja dann beenden, wenn nicht dann soll ein Verzeichnis durchsucht werden nach *.tar und *.zip. Ist keine Datei vorhanden, dann soll das Script beendet werden.

    Ist eine Datei vorhanden dann soll das Programm ****.exe gestartet werden. Nach 30 sec. soll der Vorgang des Verzeichnisdurchzsuchen wiederholt werden, solange bis das Verzeichnis leer ist.

    Ich hoffe ich bin nicht zu unverschämt.

    MfG.

    Epsodus

    Donnerstag, 4. Juni 2015 04:59

Alle Antworten

  • $process = Get-Process | Where-Object {$_.Name -eq "firefox"} #gucken ob Firefox.exe läuft
    
    
    if($process -eq "") #Wenn der Prozess nicht läuft, dann...
    {
        $Endungen = ‚*.tar‘,‘*.zip‘ #Deine Dateiendungen
        $filter = Get-ChildItem -Path "C:\Users\xxxxx\Desktop\Powershell" -Include $Endungen -Recurse #Der Pfad wo nach Dateien mit den Dateiendungen gesucht wird
    
        if($filter -eq "") 
        {
            exit #wenn es keine Dateien mit der Dateiendung gibt, dann wird das Script beendet
        }
        else
        {
            Start-Process "xxxxx.exe" #Gibt es Dateien, dann wird das Programm "xxxxx.exe" gestartet
            Start-Sleep -Seconds 30 #Es wird 30 Sekunden gewartet
        }
    }
    else #Wenn der Prozess läuft, dann wird das Script beendet
    {
    exit
    }

    Das ist davon ein grober Aufbau. Fehlt halt nur noch der Loop ^^
    Donnerstag, 4. Juni 2015 08:33
  • Hallo,

    vielen vielen Dank. Habe mir jetzt ein Buch über Powershell bestellt und ein Pdf besorgt.

    Werde jetzt mal von Grund auf anfangen.

    Jetzt habe ich mal noch eine Frage, ist es sinnvoll die Überwachung des Programm start mit der oben beschriebenen Routine zumachen oder sollte man das mit Semaphore oder Mutex umsetzen ?

    Jetzt muss ich nur noch die Schleife hinbekommen, wenn im Verzeichis noch eine datei ist, erneut das

    Programm xxxx.exe starten.

    Habe noch viel zu lernen und werde mich heute damit beschäftigen.

    Nochmals DANKE

    Donnerstag, 4. Juni 2015 09:55
  • Hallo, ich habe mir wohl doch zuviel vorgenommen. Jetzt komme ich mit der do while Schleife ins schleudern.

    Kann mir noch jemand sagen wo diese eingebaut werden muss ??

    Die Schleife sollte hier anfangen ( $Endungen = ‚*.tar‘,‘*.zip‘ #Deine Dateiendungen ) und solange laufen

    bis alle Dateien abgearbeitet sind bzw. das Verzeichnis leer ist.

    Freitag, 5. Juni 2015 08:53
  • Hi,

    dafür wäre auch For-Each die richtige Wahl :)

    foreach($file in Get-ChildIteam $DEINPFAD)
    {
    #Hier kommt dein Code 
    }

    Freitag, 5. Juni 2015 09:41
  • Hallo,

    DANke für den Tip mit foreach.

    Mein Problem ist im Moment die erste Abfrage :

    $process = Get-Process | Where-Object {$_.Name -eq "java"} #gucken ob java.exe läuft


    if($process -eq "") #Wenn der Prozess nicht läuft, dann...

    Danach geht es nicht weiter und muss es nicht {$_ProcessName -eq ....} heisen ?

    Die erste Zeile $process wird ausgeführt, dann steigt das Programm nach if...... aus.

    MfG. Volker

    Sonntag, 7. Juni 2015 08:03
  • Moin epsodus, 

    wir hatten auf unserem letzten User Group Meeting hier in Berlin einen kleinen PowerShell Crash Kurs. 

    Vielleicht ist das Video ja interessant für dich :) 

    PowerShell Crashkurs mit Haiko Hertes - WinSvr UG Berlin

    LG 

    Flo 


    Montag, 8. Juni 2015 07:32
  • Hallo,

    dass video werde ich mir anschauen, Danke. Nun nochmal zu Programm,

    die Abfrage :

    $process = Get-Process | Where-Object {$_.Name -eq "firefox"} #gucken ob Firefox.exe läuft
    if($process -eq "") #Wenn der Prozess nicht läuft, dann...


    hat so nicht funktioniert. Habe es wie folgt abgeändert :

    $process = Get-Process | Where-Object {$_.Name -match "java"} #geprüft wird.......
        if($process -match "java")
         {
           "Java ist gestartet"
            exit
         }
              else
        {

    Jetzt funktioniert er. Der nächste Aufruf wird auch nicht funktionieren

    $Endungen = ‚*.tar‘,‘*.zip‘ #Deine Dateiendungen
    
    $filter = Get-ChildItem -Path "C:\Users\xxxxx\Desktop\Powershell" -Include $Endungen -Recurse
    
     if($filter -eq "")
    
     exit #wenn es keine Dateien mit der Dateiendung gibt, dann wird das Script beendet

    Hier wird ja das Unterverzeichnis inkl. aller darunter liegen Verzeichnisse durchsucht. Es soll ja nur das Unterverzeichnis " Powershell "durchsucht werden. Leider funktioniert die -eq Anweisung auch nicht, da muss ich noch schauen warum. Vielleicht kann hier noch einer helfen.

    Montag, 8. Juni 2015 10:16
  • > $process = Get-Process | Where-Object {$_.Name -eq "java"} #gucken ob
    > if($process -eq "") #Wenn der Prozess nicht läuft, dann...
     
    Objekte überall :)
     
    Wenn die erste Abfrage nix findet, dann ist $process nicht "", sondern
    $null:
     
    If ( !$process ) #Wenn der Prozess nicht läuft, dann...
     Oder gleich so:
     
    If ( !( Get-Process -Name "java" ) )
     

    Greetings/Grüße, Martin

    Mal ein gutes Buch über GPOs lesen?
    Good or bad GPOs? - my blog…
    And if IT bothers me - coke bottle design refreshment (-:
    Montag, 8. Juni 2015 12:24
  • Hallo Martin,

    das funktioniert auch gut, wieder etwas gelernt. Aber wie kann ich das abfragen :

    NUR in Powershell suchen

     $Endungen = ‚*.tar‘,‘*.zip‘ #Deine Dateiendungen
        $filter = Get-ChildItem -Path "C:\Users\xxxxx\Desktop\Powershell" -Include $Endungen -Recurse #Der Pfad wo nach Dateien mit den Dateiendungen gesucht wird

        if($filter -eq "")
        {
            exit #wenn es keine Dateien mit der Dateiendung gibt, dann wird das Script beendet
        }
        else
        {
            Start-Process "xxxxx.exe" #Gibt es Dateien, dann wird das Programm "xxxxx.exe" gestartet
            Start-Sleep -Seconds 30 #Es wird 30 Sekunden gewartet

    Ich habe es jetzt so gemacht :

     $CheckFile = Test-Path C:\Users\xxxxx\Desktop\Powershell\* -include *.zip, *.tar
                  
          if ($CheckFile)
            { echo "File vorhanden"
              Start-Process -filepath C:\Users\xxxxx\Desktop\Start\start_SMD_Test.cmd #-verb runas
              Start-Sleep -Seconds 5 #Es wird 5 Sekunden gewartet
            }
            
               else
          
            { echo "kein File vorhanden"
              exit
            }

    Gruß Volker

    Montag, 8. Juni 2015 15:47
  • Hallo Martin,

    war etwas blind, es läuft jetzt, Dank deines Tip. Umgesetzt habe ich es jetzt so :

    $process = Get-Process | Where-Object {$_.Name -eq "java"} #gucken ob java.exe läuft
    
    
    If ( !$process ) #Wenn der Prozess nicht läuft, dann...
    
    {
    
        echo "java läuft nicht"
        $Endungen = ‚*.tar‘,‘*.zip‘ #Deine Dateiendungen
        $filter = Get-ChildItem -Path C:\Users\xxxxx\Desktop\Powershell\*  -Include $Endungen  #Der Pfad wo nach Dateien mit den Dateiendungen gesucht wird
        echo $Filter
        if( !$Filter ) 
        {
        echo "Es gibt keine zip oder tar Dateien"
            exit #wenn es keine Dateien mit der Dateiendung gibt, dann wird das Script beendet
        }
        else
        {
            Start-Process -filepath C:\Users\xxxxx\Desktop\Start\start_SMD_Test.cmd #-verb runas
            Start-Sleep -Seconds 5 #Es wird 5 Sekunden gewartet
        }
    }
    else #Wenn der Prozess läuft, dann wird das Script beendet
    {
    echo "java läuft"
    exit
    }

    Aber für einen Hinweis wäre ich noch dankbar, dies probiere ich schon die ganze Zeit :

    foreach($file in Get-ChildIteam $DEINPFAD)
    {
    #Hier kommt dein Code
    }

    Wie kann ich die Schleife bilden, bis das Verzeichnis keine Zip oder tarfiles mehr enthält ? Das gestartete CMD bearbeitet immer nur ein File.

    Gruß Volker

    Montag, 8. Juni 2015 16:14