none
windows explorer fenster (pfad) öffnen und wieder schließen RRS feed

  • Frage

  •  

    hallo,

    ich bin ein absoluter neuling mit powershell und wollte fragen, wie foldender sachverhalt mit powershell dargestellt werden kann.

    ich möchte mit dem windows explorer einen bestimmten pfad öffnen (zb.: z:\) und nach ein paar sekunden dieses windows explorer fenster wieder schließen. da windows das explorer fenster nur mit dem task explorer.exe öffnet kann ich nicht mit dem taskkill-befehl arbeiten.

    im prinzip brauche ich diesen kurzen zugriff um nach einem ausgeschalteten server die netzlaufwerk-verknüpfung wieder zu reaktivieren (für den mediacenter).

     

    hoffe, dass ihr mir hierfür ne leichte lösung geben könnt.

     

    mfg puntipik

    Dienstag, 9. Februar 2010 10:23

Antworten

  • Hi,

    das von dir gewollte Vorhaben könntest du folgendermaßen realisieren : 

    Invoke-Expression "c:\windows\explorer.exe z:"
    start-sleep -s 5
    $explorer = gwmi -computer . -query "select * from win32_process where name='explorer.exe'"
    $explorer.terminate()

    Idealerweise speicherst du die die vier Zeilen als PS1-Skript.

    Gruß
    Martin

    p.s.: Ich verstehe trotzdem nicht, was du damit bezwecken willst...
    Dienstag, 9. Februar 2010 23:51
  • Die schleife funktioniert so nicht. Zudem musst du den Process Explorer.exe aus der $explorer Variable rausfiltern sonst wird auch der mit geschlossen, was du ja nich willlst. Die letzten 3 Zeilen sollten dann in etwa so aussehen :

    $explorer = gwmi -computer . -query "select * from win32_process where CommandLine!='explorer.exe' And name='explorer.exe'"
     foreach ($explorer in $explorer) {
      $explorer.terminate()
    }

    Gruß
    Martin
    Donnerstag, 11. Februar 2010 11:21

Alle Antworten

  • Hi,

    das von dir gewollte Vorhaben könntest du folgendermaßen realisieren : 

    Invoke-Expression "c:\windows\explorer.exe z:"
    start-sleep -s 5
    $explorer = gwmi -computer . -query "select * from win32_process where name='explorer.exe'"
    $explorer.terminate()

    Idealerweise speicherst du die die vier Zeilen als PS1-Skript.

    Gruß
    Martin

    p.s.: Ich verstehe trotzdem nicht, was du damit bezwecken willst...
    Dienstag, 9. Februar 2010 23:51
  • hallo,

    danke erstmal.

    der befehl oben schließt doch aber nur einfach den process "explorer.exe", oder? dann wird ja nicht nur das windows explorer fenster geschlossen, sondern der ganze explorer (taskleiste,...).
    gibt es eine möglichkeit nur das (oder alle) offenen windows explorer fenster zu schließen?

    @zweck:
    mein problem ist volgendes. ich habe einen mediacenter im wohnzimmer, mit dem ich über verbundene netzlaufweke auf meinen server zugreife, wo die filme gespeichert sind. (z: und y:). der server geht aber wenn er eine stunde nichts zu tun hat in den standby modus. wenn ich nun aber den mediacenter einschalte während der server aus ist und diesen quasi erst nach dem mediacenter aus dem standby hole kann der mediacenter nicht mehr automatisch im mediacenter-programm auf die filme zugreifen - erst wenn ich im windows explorer einmal auf die benötigten netzlaufwerke geklickt habe - ich muss sie quasi reaktivieren.

    wenn es mit powershell eine andere, bessere methode gibt die netzlaufwerke wieder zu aktivieren - bitte um info.
    ich weiß nur, wenn ich die netzlaufwerke noch nicht reaktiviert habe und per cmd.exe darauf zugreifen versuche erkennt er sie auch nicht - wie gehabt erst wenn ich sie im windows explorer einmal angeklickt habe.

    hoffe es gibt da was brauchbares, was ich in den mediacenter einbauen kann, damit der die netzlaufwerke automatisch wieder reaktivieren kann (per bat oder ps-skript datei)

    thx mfg puntipik
    Mittwoch, 10. Februar 2010 09:36
  • nein,tut der nicht, sonst hätte ich`s mir einfacher gemacht. z.B mit dem : "stop-process" Cmdlet. Das Skript schließt wirklich nur das Explorer fenster und bendet nicht den ganzen Process. Wenn du alle Explorer Fenster schließen willst (falls mehrere offen sind) dann kannst du ja noch eine for each Schleife reinbasteln.

    Noch mal zu deinen Grundproblem. Hast du es denn schon mal mit Wake On Lan versucht? Das geht ganz ohne PS.
    Mittwoch, 10. Februar 2010 17:30
  • ich wecke meinen server eh mit wake on lan auf - wenn der server im standby ist und ich den mediacenter starte fürt er automatisch eine wake on lan - bat datei aus mit der der server aufgeweckt wird. da dadurch der server aber nach dem mediacenter aufwacht sind die netzlaufwerke beim starten des mediacenters nicht "aktiviert" worden. im mediacenter kann nicht automatisch auf den server zugegriffen werden. erst wenn ich im windows explorer auf z: gehe geht es dann auch wieder im media center.
    Mittwoch, 10. Februar 2010 17:42
  • so gesehen sollte dann mein "Skript" dir weiter helfen...
    Mittwoch, 10. Februar 2010 20:24
  • hallo,

    danke erstmals.

    ich möchte jetzt gleich mein ganzes vorhaben mit dem ps-skript erfüllen - nicht per bat-datei wakeonlan und per ps explorer fenster schließen.

    ist der folgende text so ca. richtig?

    ---
    Invoke-Expression "H:\Eigene Dateien\WakeOnLan\wake.exe" 00-26-18-f4-50-d2 192.168.0.255
    start-sleep -s 20
    Invoke-Expression "c:\windows\explorer.exe z:"
    Invoke-Expression "c:\windows\explorer.exe y:"
    start-sleep -s 5
    $explorer = gwmi -computer . -query "select * from win32_process where name='explorer.exe'"
    foreach ($explorer -eq $null) {
    $explorer.terminate()
    }
    ---

    bei der foreach-schleife weiß ich nicht wie man ausdrückt - solange $explorer nicht null ist?

    mfg puntipik
    Donnerstag, 11. Februar 2010 10:03
  • Die schleife funktioniert so nicht. Zudem musst du den Process Explorer.exe aus der $explorer Variable rausfiltern sonst wird auch der mit geschlossen, was du ja nich willlst. Die letzten 3 Zeilen sollten dann in etwa so aussehen :

    $explorer = gwmi -computer . -query "select * from win32_process where CommandLine!='explorer.exe' And name='explorer.exe'"
     foreach ($explorer in $explorer) {
      $explorer.terminate()
    }

    Gruß
    Martin
    Donnerstag, 11. Februar 2010 11:21
  • hallo,

    ich bekomme bei meinem skript für die erste zeile folgenden fehler:

    ---
    Invoke-Expression : Es wurde kein Positionsparameter gefunden, der das Argument "00-26-18-f4-50-d2" akzeptiert.
    Bei C:\Users\homer.simpson\Desktop\WakeOnLan_Zugriff.ps1:1 Zeichen:18
    + Invoke-Expression <<<<  "H:\Eigene Dateien\WakeOnLan\wake.exe" 00-26-18-f4-50-d2 192.168.0.255
        + CategoryInfo          : InvalidArgument: (:) [Invoke-Expression], ParameterBindingException
        + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.InvokeExpressionCommand
    ---

    der rest des skripts funktioniert einwandfrei - danke

    ps: wie kann ich das skript-file von einem anderen programm aus ausrufen? wenn ich nur die datei angebe wird sie mit dem editor geöffnet. das file selber muss ich mit rechter maustaste "mit powershell ausführen" starten. wie mach ich dass per dateiaufruf.
    Donnerstag, 11. Februar 2010 13:55
  • Ich kenne das Wake Tool nicht... hast du es schon damit probiert : Invoke-Expression "H:\Eigene Dateien\WakeOnLan\wake.exe 00-26-18-f4-50-d2 192.168.0.255"

    Du kannst das Skript mit Hilfe einer Batch Datei starten. Dazu musst du beispielweise die Zeile "powershell.exe c:\Skript.ps1" in die Batch einfügen und dann abspeichern.
    Donnerstag, 11. Februar 2010 14:35
  • wenn ich den ganzen string in "" setze kommt folgende fehlermeldung:

    ---
    Invoke-Expression "H:\Eigene Dateien\WakeOnLan\wake.exe 00-26-18-f4-50-d2 192.168.0.255"
    ---
    Die Benennung "H:\Eigene" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (so
    fern enthalten), und wiederholen Sie den Vorgang.
    Bei Zeile:1 Zeichen:10
    + H:\Eigene <<<<  Dateien\WakeOnLan\wake.exe 00-26-18-f4-50-d2 192.168.0.255
        + CategoryInfo          : ObjectNotFound: (H:\Eigene:String) [], CommandNotFoundException
        + FullyQualifiedErrorId : CommandNotFoundException
    ---

    das wake tool ist ne exe datei der man als parameter eine mac-adresse und den sub-netzwerk-bereich übergibt.
    Donnerstag, 11. Februar 2010 17:02
  • Dann klappt die Parameter Übergabe über die PS nicht. Du hast keine andere Wahl als wake.exe aus der Batch heraus auszuführen.
    Donnerstag, 11. Februar 2010 18:28
  • ok danke.

    ps: ich glaubte immer, dass die powershell die weiterentwicklung und ablöse von der cmd.exe bzw. batch-datei ist. nun brauch ich es aber erst wieder, weil es im powershell nicht geht? schade.

    mfg puntipik
    Donnerstag, 11. Februar 2010 18:40
  • Irgendwann wird die PS die Command Shell sicherlich ablösen. Momentan braucht man aber noch beide. Zumal viele Programme, die ursprünglich für CMD programmiert wurden sind auch nur 100%ig darunter laufen. Du kannst aber mal googeln, ob es nicht vielleicht ein PS-Skript gibt, das WOL machen kann.

    Gruß
    Martin
    Donnerstag, 11. Februar 2010 19:52
  • puntipik:

    > wenn ich den ganzen string in "" setze kommt folgende fehlermeldung:
    > Invoke-Expression "H:\Eigene Dateien\WakeOnLan\wake.exe 00-26-18-f4-50-d2 192.168.0.255"
    > Die Benennung "H:\Eigene" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei
    > oder eines ausführbaren Programms erkannt.

    Du hast Leerzeichen im Pfad. Nimm statt "Eigene Dateien" den Kurznamen mit ~
    oder setze die korrekte Anzahl der Anführungszeichen. Es dürften wohl sechs
    Stück fällig werden.

    hpm
    Freitag, 12. Februar 2010 11:59
  • Hi Hans-Peter,

    guter Tipp. Daran hatte ich garnicht gedacht. Bzw. habe die Fehlermeldung nicht gründlich gelesen. Also Puntik "Eigene Dateien" durch "Eigene~1" ersetzen. Dann sollte es theoretisch klappen.

    Freitag, 12. Februar 2010 15:48
  • hallo,

    was meinst du mit "setze die korrekte anzahl an anführungszeichen"?

    könntest du mir das zeigen?

    mfg
    Freitag, 12. Februar 2010 16:29
  • puntipik:

    > was meinst du mit "setze die korrekte anzahl an anführungszeichen"?
    > könntest du mir das zeigen?

    Wenn du den Kurznamen nicht nehmen willst, würde ich es mal mit
    """H:\Eigene Dateien\WakeOnLan\wake.exe 00-26-18-f4-50-d2 192.168.0.255"""
    versuchen. Klappt es denn überhaupt mit dem Kurznamen?

    hpm
    Freitag, 12. Februar 2010 17:50
  • hallo,

    wieso brauch ich am anfang drei und am ende drei (in der mitte keine) - welche ps logik steckt dahinter?

    thx
    mfg

    ps: habs noch nicht ausprobiert
    Samstag, 13. Februar 2010 09:14
  • hallo,

    habs jetzt mal ausprobiert.

    mit den kurznamen geht es:
    "H:\Eigene~1\WakeOnLan\wake.exe 00-26-18-f4-50-d2 192.168.0.255"

    aber mit den anführungszeichen geht es nicht:
    """H:\Eigene Dateien\WakeOnLan\wake.exe 00-26-18-f4-50-d2 192.168.0.255"""

    mir wäre die anführungszeichen-variante aber lieber, da es für andere skripte manchmal ziemlich kompliziert werden könnte.

    mfg
    Samstag, 13. Februar 2010 09:32
  • Hallo puntipik,
    nimm den Call-Operator.
    Mit Deiner EXE müsste das so aussehen:

    & 'H:\Eigene Dateien\WakeOnLan\wake.exe' 00-26-18-f4-50-d2 192.168.0.255


    Beispiel mit ping.exe:

    & 'd:\Program Files (x86)\Test\ping.exe' -n 1 localhost

    Alternativ kannst du den Befehl auch in einer Variable speichern und dann aufrufen.

    $Befehl = 'd:\Program Files (x86)\Test\ping.exe'
    & $Befehl -n 1 localhost

    Wenn du in dem Pfad Variablen verwendest musst Du doppelte Anführungszeichen verwenden damit diese aufgelöst werden.

    Die Grundregel lautet: Der Call-Operator kann nur einen Befehl ohne Parameter verarbeiten (er kann auch mehrere, aber das führt hier sicher zu weit). Die Parameter werden dahinter getrennt übergeben.

    VG
    Bernd

    Samstag, 13. Februar 2010 10:39
  • puntipik:

    > mit den kurznamen geht es:
    > "H:\Eigene~1\WakeOnLan\wake.exe 00-26-18-f4-50-d2 192.168.0.255"

    OK

    > aber mit den anführungszeichen geht es nicht:
    > """H:\Eigene Dateien\WakeOnLan\wake.exe 00-26-18-f4-50-d2 192.168.0.255"""

    Ich erstelle Skripte entweder via cmd oder aber über den Script-Host als
    vbs-Skript. Da kommen bei Leerzeichen im Pfad in obigem Beispiel die 6
    Anführungszeichen zum Einsatz. Mit powershell hab ich noch nichts gemacht,
    bin da nur interessierter Mitleser.

    hpm
    Samstag, 13. Februar 2010 13:11
  • hallo,

    @hans-peter:

    was ist eigentlich der genauere unterschied zwischen cmd, wsscript und powershell?

    cmd ist das einfachste (stapelverarbeitung) ist mir klar.

    was ist eigentlich das beste für kleine skripte? bin mir gar nicht so sicher, ob powershell da so gut ist. erstens das problem jetzt, zweitens der start des skripts. wenn ich es einfach nur so aufrufe wird es im editor geöffnet.

    kann man zb. per wsscript auch nur die explorerfenster schließen.

    mfg
    Samstag, 13. Februar 2010 18:00
  • Für dein Vorhaben ist PS, keine schlechte Wahl. Mit Batch wäre es in dieser Form nicht möglich gewesen. Welche Skriptsprache nun die Beste für "kleine Skripte" ist, lässt sich nicht pauschal beantworten. Es kommt drauf an was das Skript tun soll. 
    Samstag, 13. Februar 2010 18:20
  • hallo,

    wie wäre es mit folgender aufgabe (andere problemstellung):

    eine browseforfolder abfrage, um einen pfad einzugeben.
    eine normale zahlenwert abfrage
    und dann soll ein commandline programm ausgeführt werden in dem mehrere paramater fix und die zwei abgefragten parameter mitübergeben werden sollen - der pfad soll auch noch in anführungszeichen mitübergeben werden.

    hab es primitiv in cmd hinbekommen, aber der pfad muss händisch eingetragen werden.
    in ps habe ich ne schöne abfrage, aber der aufruf des programms mit den parametern habe ich noch nicht hinbekommen.
    gewünschter aufruf:

    pfad = zb. c:\hallo
    zeit = zb: 5

    "c:\... ...\test.exe" -c 9 -C $zeit "$pfad"

    rauskommen sollte

    c:\... ...\test.exe -c 9 -C 5 "c:\hallo"


    mfg
    Samstag, 13. Februar 2010 19:18
  • puntipik:

    > was ist eigentlich der genauere unterschied zwischen cmd, wsscript und powershell?

    Batchdateien, vbscript und powershell sind halt unterschiedliche
    Skriptvarianten/sprachen.

    > was ist eigentlich das beste für kleine skripte? bin mir gar nicht so sicher, ob powershell da so gut
    > ist. erstens das problem jetzt, zweitens der start des skripts. wenn ich es einfach nur so aufrufe wird
    > es im editor geöffnet.

    Wie schon gesagt, was das Beste ist, hängt stark von der Aufgabe ab.

    > kann man zb. per wsscript auch nur die explorerfenster schließen.

    Ein Explorerfenster könnte man z.B. so beenden(quick&dirty):

    set WshShell = WScript.CreateObject("WScript.Shell")
    WshShell.AppActivate "X:\Pfad(bzw. Fenstername)" 'Fokus auf Fenster setzen
    WScript.Sleep 2000 'Wartezeit einstellen
    wshShell.SendKeys "%{F4}" 'Fenster schließen

    hpm
    Samstag, 13. Februar 2010 23:11
  • hallo,

    thx, mit den ganzen infos hab ich's jetzt hinbekommen.

    mfg
    Sonntag, 14. Februar 2010 10:42