PowerShell Skript Frage
Hallo!
Die ich gerade erst angefangen habe mich mit der PowerShell auseinander zusetzen, wollte ich zuerst eine "alte" BATCH Datei migrieren.
Das Batch-Skript ist einfach aufgebaut und beendet bestimmte Dienste und Prozesse:
Der devcon Befehl ist eine eigenständige Datei bzw. ein Tool von Microsoft mit dem Netzwerkschnittstellen de- und aktivieren kann.
Jetzt möchte ich das Ganze, wie schon erwähnt, mit der PowerShell verwirklichen. Das sieht bisher so aus:
Funktioniert. Aber wie kann ich die Netzwerkschnittstelle, in meinem Fall ein USB WLAN Stick, deaktivieren?
Und vielleicht noch ein anderer Ansatz für das Beenden der Dienste und Prozesse:
Von z.B. 20 Diensten, gebe ich im Skript an, dass er 15 beenden soll. Geht es eigentlich auch umgekehrt,
also das ich im Skript angebe, dass er alle 20 beendet bis auf DIENST1, DIENST2 usw... (also 5 Stück)
thx im Voraus.
Die ich gerade erst angefangen habe mich mit der PowerShell auseinander zusetzen, wollte ich zuerst eine "alte" BATCH Datei migrieren.
Das Batch-Skript ist einfach aufgebaut und beendet bestimmte Dienste und Prozesse:
devcon disable "USB\Vid_0846&Pid_4240&Rev_1040"
net stop "DIENSTNAME1"
net stop "DIENSTNAME2"
net stop "DIENSTNAME3"
taskkill /S HOST /F /IM prozess1.exe /T
taskkill /S HOST /F /IM prozess2.exe /T
taskkill /S HOST /F /IM prozess3.exe /T
Der devcon Befehl ist eine eigenständige Datei bzw. ein Tool von Microsoft mit dem Netzwerkschnittstellen de- und aktivieren kann.
Jetzt möchte ich das Ganze, wie schon erwähnt, mit der PowerShell verwirklichen. Das sieht bisher so aus:
stop-service -force DIENSTNAME1,DIENSTNAME2,DIENSTNAME3
stop-process -name prozess1,prozess2,prozess3
Funktioniert. Aber wie kann ich die Netzwerkschnittstelle, in meinem Fall ein USB WLAN Stick, deaktivieren?
Und vielleicht noch ein anderer Ansatz für das Beenden der Dienste und Prozesse:
Von z.B. 20 Diensten, gebe ich im Skript an, dass er 15 beenden soll. Geht es eigentlich auch umgekehrt,
also das ich im Skript angebe, dass er alle 20 beendet bis auf DIENST1, DIENST2 usw... (also 5 Stück)
thx im Voraus.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 87083
Url: https://administrator.de/contentid/87083
Ausgedruckt am: 08.11.2024 um 19:11 Uhr
26 Kommentare
Neuester Kommentar
Hallo thorsten-rehm
Du kannst in PowerShell alle Exe-Files genau wie in einer Batch gebrauchen. Die devcon.exe kannst du also ohne Probleme weiterverwenden....
Allerdings verstehe ich, dass wenn man schon die mächtige PowerShell zur Verfügung hat, diese auch nutzen will und nicht mehr auf externe Tools angewiesen sein will.
Ich probiere mal ein paar Sachen aus, ich melde mich wieder....
Du kannst in PowerShell alle Exe-Files genau wie in einer Batch gebrauchen. Die devcon.exe kannst du also ohne Probleme weiterverwenden....
Allerdings verstehe ich, dass wenn man schon die mächtige PowerShell zur Verfügung hat, diese auch nutzen will und nicht mehr auf externe Tools angewiesen sein will.
Ich probiere mal ein paar Sachen aus, ich melde mich wieder....
Hallo,
da devcon kein in die cmd integrierte Befehl ist, sondern in Programm kannst du es aus der Powershell genauso aufrufen wie aus der cmd auch.
Ein "Beende alles bis auf" gibt es erstmal nicht. Was man aber machen kann ist, sich eine Liste aller Dienste liefern lassen, dann über diese iterieren und für alle, deren Name nicht in einer Liste ist beenden.
Grob:
Gruß
Filipp
da devcon kein in die cmd integrierte Befehl ist, sondern in Programm kannst du es aus der Powershell genauso aufrufen wie aus der cmd auch.
Ein "Beende alles bis auf" gibt es erstmal nicht. Was man aber machen kann ist, sich eine Liste aller Dienste liefern lassen, dann über diese iterieren und für alle, deren Name nicht in einer Liste ist beenden.
Grob:
$servicesLetLive = "Svc1;svc2;svc3;"
$services = get-service
foreach($service in $services){
if(!$servicesLetLive.Contains($service.DisplayName+";"){
$service | restart-service
}
}
Gruß
Filipp
Hallo thorsten-rehm
Folgendes habe ich gefunden:
Gemäss diesem Link (http://www.vistax64.com/powershell/27830-enable-disable-network-connect ..) funktioniert dieses Script:
Die folgende Zeile muss du anpassen:
Statt <DeviceID deiner Netzwerkkarte> fügst du die DeviceID deiner Netwerkkarte ein. Diese findest du mit dem folgenden Befehl in der PowerShell heraus:
Dieser Befehl listet dir alle Netzwerkadapter samt MAC-Adresse und DeviceID heraus. Du musst nur noch die richtige heraussuchen.
Zum Script selber:
Ich selbst habe es nicht getestet, kann dir also keine Garantie gegeben.
Ich wäre also auch froh um ein Feedback, ob es geklappt hat.
Folgendes habe ich gefunden:
Gemäss diesem Link (http://www.vistax64.com/powershell/27830-enable-disable-network-connect ..) funktioniert dieses Script:
$yourDeviceID = <DeviceID deiner Netzwerkkarte>
$YourNIC = Get-WmiObject win32_networkadapter | where {$_.DeviceId -eq $yourDeviceID}
$YourNIC.disable()
Die folgende Zeile muss du anpassen:
$yourDeviceID = <DeviceID deiner Netzwerkkarte>
Statt <DeviceID deiner Netzwerkkarte> fügst du die DeviceID deiner Netwerkkarte ein. Diese findest du mit dem folgenden Befehl in der PowerShell heraus:
get-wmiobject win32_networkadapter | select-object Name, MACAddress, DeviceID | format-table
Zum Script selber:
Ich selbst habe es nicht getestet, kann dir also keine Garantie gegeben.
Ich wäre also auch froh um ein Feedback, ob es geklappt hat.
Tja, dann kann man wohl definitiv nicht per WMI einen NIC disablen. Schade.....
Naja, dann würde ich wieder zur devcon.exe greifen, um den NIC zu disablen.
Ich hab irgendwo gelesen, dass es ein .NET-Objekt gibt, mit dem man einen NIC ebenfalls disablen kann. Hab allerdings kein Codebeispiel gesehen und der Verfasser des Forumeintrags war sich auch nicht sicher.....
Spar dir den Aufwand und greif wieder zur devcon.exe.
Naja, dann würde ich wieder zur devcon.exe greifen, um den NIC zu disablen.
Ich hab irgendwo gelesen, dass es ein .NET-Objekt gibt, mit dem man einen NIC ebenfalls disablen kann. Hab allerdings kein Codebeispiel gesehen und der Verfasser des Forumeintrags war sich auch nicht sicher.....
Spar dir den Aufwand und greif wieder zur devcon.exe.
Kopier die Devcon.exe in einen Ordner, die in der Path-Variable drin ist, z.B. C:\Windows
Dann kannst du die Befehlszeile wie in der Batch setzen:
Die den Inhalt der Path-Variable kannst du folgendermassen abrufen (in der PowerShell):
Die einzelnen Pfade sind dort mit Semikolons getrennt abgelegt.
Dann kannst du die Befehlszeile wie in der Batch setzen:
devcon disable "USB\Vid_0846&Pid_4240&Rev_1040"
Die den Inhalt der Path-Variable kannst du folgendermassen abrufen (in der PowerShell):
write-host $env:path
Gibt die devcon.exe Errorlevel aus (in der Doku nachschauen)? Wenn ja, kannst du mit einer if- oder einer switch-Abfrage die Variable "$Lastexitcode" auswerten und dann je nach Ergebnis andere Befehle ausführen. Das Ganze sieht dann in etwa so aus:
devcon .............
if ($lastexitcode -eq "1") {
Mache dies....
} else {
Mache das....
}
Geht das mit goto oder so?
GOTO ist in jeder strukturierten Programmiersprache, also auch in der PowerShell Script Language, verpönt. In der PowerShell gibt es meines Wissens auch kein GOTO, braucht es auch nicht.
Hallo,
einer von uns beiden hat da gerade einen kleinen Hänger.
So wie ich das sehe, sorgt die erste Zeile immer dafür, dass die Karte deaktiviert wird (und da ist kein "if" davor). Folglich gibt die Prüfung im if auch immer true.
Gruß
Filipp
edit: außerdem prüft die Schleife, ob der Adapter abgeschaltet ist. Wenn er es nicht ist (also an) wird der else-Zweig ausgeführt, und der Adapter wird angeschaltet.
Einer von uns beiden muss das nochmal genau anschauen
einer von uns beiden hat da gerade einen kleinen Hänger.
So wie ich das sehe, sorgt die erste Zeile immer dafür, dass die Karte deaktiviert wird (und da ist kein "if" davor). Folglich gibt die Prüfung im if auch immer true.
Gruß
Filipp
edit: außerdem prüft die Schleife, ob der Adapter abgeschaltet ist. Wenn er es nicht ist (also an) wird der else-Zweig ausgeführt, und der Adapter wird angeschaltet.
Einer von uns beiden muss das nochmal genau anschauen
Moin thorsten-rehm,
Magst Du nochmal kurz (zur Sensibilisierung) filipps letzten Kommentar lesen und danach bitte noch einmal, was Du als jetzigen Zustand Deines Zustands bezeichnet hast?
Sonst übersetze ich mal in Pseudocode:
Was filipp andeutete war, das der PowerShell-Schnipsel eventuell works as designed.
Und man/frau es deshalb (diesmal) nicht M$ anlasten darf.
Grüße
Biber
was mich verwundert, da ja alles korrekt aussieht.
ähmm...Magst Du nochmal kurz (zur Sensibilisierung) filipps letzten Kommentar lesen und danach bitte noch einmal, was Du als jetzigen Zustand Deines Zustands bezeichnet hast?
Sonst übersetze ich mal in Pseudocode:
devcon disable "USB\Vid_0846&Pid_4240&Rev_1040"
$status = devcon status "USB\Vid_0846&Pid_4240&Rev_1040"
if ($status -like "*disabled*") {
stop-process -name taskmgr
} else {
devcon enable "USB\Vid_0846&Pid_4240&Rev_1040"
}
Klemm mit Devcon das US-Geraffel ab
Frag den Status vom USB-Geraffel ab
Wenn Status so wie *abgeklemmt*
Hau-Wech einen Prozess
wenn nich so wie *abgeklemmt*
Klemm sicherheitshalber nochmal mit DevCon das USB-Geraffel wieder an
/* aber starte es erstmal noch nicht */
Ende vons Wenn
Was filipp andeutete war, das der PowerShell-Schnipsel eventuell works as designed.
Und man/frau es deshalb (diesmal) nicht M$ anlasten darf.
Grüße
Biber
Also nochmal:
Uns selbst, wenn du mal in die else-Schleife kommen solltest: else bedeutet, das Gerät ist enabled. Warum schaltest du es dann in Zeile 6 gleich nochmal an?
1: devcon disable "USB\Vid_0846&Pid_4240&Rev_1040" Als erstes deaktivierst du das Gerät bei jedem Aufruf des Skriptes
2: $status = devcon status "USB\Vid_0846&Pid_4240&Rev_1040"
3: f ($status -like "*disabled*") { Diese Abfrage wird immer "true" ergeben, weil du das Gerät in Zeile 1 ja deaktiviert hast.
4: stop-process -name taskmgr
5: } else { Wird nie erreicht werden (Abfrage in 3 immer true wege 1, also niemals ins else.
6: devcon enable "USB\Vid_0846&Pid_4240&Rev_1040"
7:}
Uns selbst, wenn du mal in die else-Schleife kommen solltest: else bedeutet, das Gerät ist enabled. Warum schaltest du es dann in Zeile 6 gleich nochmal an?
Okay, und bevor wir da noch ewig drüber diskutieren, du willst wohl etwas wie:
Deaktiviert die Netzwerkkarte, wenn sie aktiviert ist, und aktiviert sie, wenn sie deaktiviert ist. Das war, soweit ich das verstanden habe, das was du wolltest. Das Anhalten der entsprechenden Dienste musst du an der entsprechenden Stelle hinzufügen.
Solltest du das ganze jetzt nicht verstehen: Vergiss es kurz, mach etwas anderes, dann lies es dir nochmal genau durch und fange von vorne an.
Gruß
Filipp
$status = devcon status "USB\Vid_0846&Pid_4240&Rev_1040"
if ($status -like "*disabled*") { #Das Gerät is mometan aus -> anschalten
devcon enable "USB\Vid_0846&Pid_4240&Rev_1040"
} else { #Das Gerät ist an -> ausschalten
devcon disable "USB\Vid_0846&Pid_4240&Rev_1040"
}
Deaktiviert die Netzwerkkarte, wenn sie aktiviert ist, und aktiviert sie, wenn sie deaktiviert ist. Das war, soweit ich das verstanden habe, das was du wolltest. Das Anhalten der entsprechenden Dienste musst du an der entsprechenden Stelle hinzufügen.
Solltest du das ganze jetzt nicht verstehen: Vergiss es kurz, mach etwas anderes, dann lies es dir nochmal genau durch und fange von vorne an.
Gruß
Filipp
Moin thorsten-rehm,
mit Powershell kenn ich mich ja nun wirklich nicht aus, aber aus anderen Skripting-Versuchen kann ich folgende Golden Rule weitergeben.
Wenn Du vier Tage lang auf denselben Codeschnipsel geschaut hast und hast ihn nicht zum Fliegen gebracht:
Grüße
Biber
[Edit] Moin filipp, ich sehe gerade, Du bist exakt zu dem gleichen Lösungsansatz gekommen...*g
Beim Coden in Powershell bin ich offensichtlich noch zu langsam..[/Edit]
mit Powershell kenn ich mich ja nun wirklich nicht aus, aber aus anderen Skripting-Versuchen kann ich folgende Golden Rule weitergeben.
Wenn Du vier Tage lang auf denselben Codeschnipsel geschaut hast und hast ihn nicht zum Fliegen gebracht:
- Druck den gesamten Code zweimal aus. Lösche danach den Quellcode und überschreibe alles 12x mit hex(FF).
- Ruf eine dieser blutjungen rothaarigen Praktikantinnen an und lade sie zu Dir nach Hause zum Candlelight-Dinner ein
- Konzentrier Dich am Herd auf die Menübereitung und nicht auf alternative IF-ELSE-Konstrukte
- Benutze die Ausdrucke dazu, stilvoll ein paar Kerzen anzuzünden und öffne eine Flasche von dem GUTEN Dornfelder. Nicht den für Kollegen.
- Macht Euch einen netten Abend.
- Nach dem Frühstück schreibst Du den Code neu.
- Und fängst dabei mit Pseudocode an.
/* Pseudocode */
Frag den Status vom USB-Geraffel ab
Wenn Status so wie *ANgeklemmt*
Hau-Wech einen Prozess (den, der bei Neustart an ANgeklemmt gestartet wird)
Klemm mit Devcon das US-Geraffel AB
wenn nich so wie *ANgeklemmt*
/* ...dann isses wohl ABgeklemmt, oder? */
Klemm mit Devcon das US-Geraffel AN
/* starte es ODER mach einen Reboot, bei dem es automatisch gestartet wird */
Ende vons Wenn
Grüße
Biber
[Edit] Moin filipp, ich sehe gerade, Du bist exakt zu dem gleichen Lösungsansatz gekommen...*g
Beim Coden in Powershell bin ich offensichtlich noch zu langsam..[/Edit]
* Ruf eine dieser blutjungen rothaarigen
Praktikantinnen an und lade sie zu Dir nach
Hause zum Candlelight-Dinner ein
Gibt es solche bei euch wirklich? Ich dachte immer das wären nur Legenden, von anderen Administratoren erzählt um einen neidisch zu machen. Ich muss da mal mit dem Chef reden, er soll mit der Personalbteilung reden.Praktikantinnen an und lade sie zu Dir nach
Hause zum Candlelight-Dinner ein
Filipp