stefan4711 3 Geschrieben 10. März 2021 Melden Teilen Geschrieben 10. März 2021 Hallo liebe Forengemeinde, ich habe mal wieder ein kleines Problemchen, ich möchte gerne mit einer Fo / L schleife eine IP Range abfragen, und auf jedem Rechner eine TXT Datei auf Existenz abcheckt und, falls vorhanden die darinstehende Versions Zahl ausliest. Irgendwie stimmt das aber hier nocht nicht, vielleicht sieht ja einer den Fehler, schön wäre es natürlich auch wenn er den jweiligen Hostnamen mittels nslookup mit angeben würde und dies in eine CSV schreibt, gibt es da eine Möglichkeit? Vielen Dank i.V. lg Stefan @Echo Off set "NET=192.168.178" SET "checkdat=c$\Program Files (x86)\PRG\aktvers.txt" for /l %%f in (38, 1, 255) do ( ping -n 1 %NET%.%%f | findstr /i "TTL" >nul 2>&1 && ( echo %hostname% if exist "\\%NET%.%%f\%checkdat%" ( echo %NET%.%%f Checkdata vorhanden SET /p vers=<"%NET%.%%f\%checkdat%" ) else ( echo %NET%.%%f CheckData nicht vorhanden ) ) || ( echo %NET%.%%f Host aus / Nicht erreichbar ) ) PAUSE Zitieren Link zu diesem Kommentar
NilsK 2.957 Geschrieben 10. März 2021 Melden Teilen Geschrieben 10. März 2021 Moin, oh je, wo hast du dir denn die Fragmente abgeguckt? Da stimmt ja eigentlich gar nichts. Das iast auch kaum korrigierbar. Vorschlag: Mach es lieber auf diesem Weg. [Excel: Admins unbekannter Liebling | faq-o-matic.net]https://www.faq-o-matic.net/2008/01/19/excel-admins-unbekannter-liebling/ Dass das nur funktioniert, wenn du es mit einem Account ausführst, der auf allen Rechnern Admin ist, ist bekannt? Gruß, Nils 1 Zitieren Link zu diesem Kommentar
stefan4711 3 Geschrieben 10. März 2021 Autor Melden Teilen Geschrieben 10. März 2021 (bearbeitet) Hm, danke erst mal für die schnelle Antwort, hab es jetzt rausgefunden, nur warum es so ist, dass es manchmal nur mit Expansion geht, und warum mal mit ! und an welcher Stelle, da hat wohl keiner so recht eine Antwort drauf, konnte mir auch noch nie einer erklären ;) Für die, die es interessiert, hier mein Ansatz @Echo Off setlocal enableextensions EnableDelayedExpansion set "NET=192.168.178" SET "checkdat=c$\Program Files (x86)\Prg\aktvers.txt" for /l %%f in (19, 1, 45) do ( ping -n 1 %NET%.%%f | findstr /i "TTL" >nul 2>&1 && ( if exist "\\%NET%.%%f\%checkdat%" ( echo %NET%.%%f Checkdata vorhanden SET /p vers=<"\\192.168.178.%%f\!checkdat!" && ECHO !vers! ) else ( echo %NET%.%%f CheckData nicht vorhanden ) ) || ( echo %NET%.%%f Host aus / Nicht erreichbar ) ) PAUSE Wäre natürlich noch schän, wenn er es mir zeilenweise in eine CSV schreiben würde, vielleicht kennt einer den Befehl lg und schönen Abend noch bearbeitet 10. März 2021 von stefan4711 Zitieren Link zu diesem Kommentar
testperson 1.707 Geschrieben 10. März 2021 Melden Teilen Geschrieben 10. März 2021 Hi, ein etwas modernerer Quick'n'Dirty Ansatz in PowerShell: $curDomain = Get-ADDomain -Current LocalComputer $AllComputer = Get-ADComputer -Filter * ` -SearchBase $curDomain.DistinguishedName foreach($Computer in $AllComputer){ if(Test-Connection -ComputerName $Computer.DNSHostName -Count 1 -Quiet){ Write-Output $("{0} -> Verbindung Ok" -f $Computer.Name) } else{ Write-Output $("{0} -> Keine Verbindung" -f $Computer.Name) } } Im Fall von "Verbindung Ok" kannst du dann mit diversen Möglichkeiten ansetzen und auf Java prüfen. Gruß Jan 1 Zitieren Link zu diesem Kommentar
stefan4711 3 Geschrieben 10. März 2021 Autor Melden Teilen Geschrieben 10. März 2021 (bearbeitet) jo vielen Dank erstmal, hätte nie gedacht dass Batch bei dieser eher einfachen Aufgabe schon ein seine Grenzen stößt. Hatte irgendwie im Hinterkopf, dass man in Txt dateien schreiben kann mit CSV Formatierung. Aber ich schau mir Deinen Ansatz gerne mal an. Auf den ersten Blick würde ich sagen, auch wenn ich von PS sicherlich keine Ahnung habe, dass hier lediglich getestet wird, ob Rechner erreichbar sind, oder sehe ich das falsch? schöne Abend noch bearbeitet 10. März 2021 von stefan4711 Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 10. März 2021 Melden Teilen Geschrieben 10. März 2021 (bearbeitet) vor 13 Minuten schrieb stefan4711: oder sehe ich das falsch? Nein. Wenn Du Dir Deine UNC-Pfade passend zusammenbaust, kannst Du auch direkt mit Test-Path prüfen, ob ein Pfad oder eine Datei vorhanden ist. Dann kannst Du sie mit Get-Content auslesen und den Inhalt entsprechend weiterverarbeiten. Selbst mit wenig Ahnung solltest Du Dir nach der Lektüre der Hilfe für die cmdlets und dem Studium der enthaltenen Beispiele, sehr leicht was Einfaches zusammenbauen können. Und wenn Du mit Powershell nicht weiterkommst, bekommst Du hier und überall ohne Probleme eine Menge Hilfe. bearbeitet 10. März 2021 von BOfH_666 Zitieren Link zu diesem Kommentar
stefan4711 3 Geschrieben 10. März 2021 Autor Melden Teilen Geschrieben 10. März 2021 also bei mir kommen bei diesem Script folgende Fehler Zitat Get-ADDomain : Die Benennung "Get-ADDomain" 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 (sofern enthalten), und wiederholen Sie den Vorgang. In C:\Users\riegert\Desktop\Unbenannt2.ps1:1 Zeichen:14 + $curDomain = Get-ADDomain -Current LocalComputer + ~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (Get-ADDomain:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException Get-ADComputer : Die Benennung "Get-ADComputer" 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 (sofern enthalten), und wiederholen Sie den Vorgang. In C:\Users\riegert\Desktop\Unbenannt2.ps1:2 Zeichen:16 + $AllComputer = Get-ADComputer -Filter * ` + ~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (Get-ADComputer:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 10. März 2021 Melden Teilen Geschrieben 10. März 2021 Dann fehlen Dir wohl die AD-cmdlets, die mit den RSAT-Tools installiert werden. Entweder nachinstallieren oder andere cmdlets benutzen. Der Code von Jan ermittelt einfach die abzufragenden Computer mit einer AD-Abfrage. Ich hab zwar keine Ahnung von CMD/Batch aber wenn ich Deinen Code korrekt interpretiere, dann scannst Du ein ganzes Netzsegment. Wenn Deine Netzwerker da nicht Alarm schlagen, kannst Du sowas auch mit Powershell machen. Quick&Dirty könntest Du so ungefähr anfangen 1..255 | ForEach-Object{ $TargetPath = "\\192.168.178.$_\c$\Program Files (x86)\Prg\aktvers.txt" [PSCustomObject]@{ IPAddress = "192.168.178.$_" FileExists = Test-Path -Path $TargetPath } } Zitieren Link zu diesem Kommentar
stefan4711 3 Geschrieben 10. März 2021 Autor Melden Teilen Geschrieben 10. März 2021 (bearbeitet) So nach einer halbe Dose Traubenzucker hab ich es nun hinbekommen, denke mal ich hatte mich nur falsch ausgedrückt, das Ergebnis sieht nun wie folgt aus, schade nur dass er nur die Computer, wo es eine Prüfdatei gibt in die Datei schreibt. Also so abwegig find ich meinen Ansatz nun gar nicht mehr, zumindest funktioniert er @Echo Off mode con cols=120 DEL /s /q "c:\aug.txt">nul setlocal enableextensions EnableDelayedExpansion set "NET=192.168.178" SET "checkdat=c$\Program Files (x86)\PRG\aktvers.txt" for /l %%f in (19, 1, 45) do ( ping -n 1 %NET%.%%f | findstr /i "TTL" >nul 2>&1 && ( if exist "\\%NET%.%%f\%checkdat%" ( SET /p vers=<"\\%NET%.%%f\!checkdat!" echo %NET%.%%f Checkdata vorhanden, !vers! echo %NET%.%%f Checkdata vorhanden, !vers! >> c:\aug.txt ) else ( echo %NET%.%%f prg nicht installiert echo %NET%.%%f prg nicht installiert > c:\aug.txt ) ) || ( echo %NET%.%%f Host nicht erreichbar echo %NET%.%%f Host nicht erreichbar > c:\check.txt ) ) PAUSE mit dem RSAT werde ich noch mal schauen bearbeitet 10. März 2021 von stefan4711 Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 10. März 2021 Melden Teilen Geschrieben 10. März 2021 vor 48 Minuten schrieb stefan4711: mit dem RSAT werde ich noch mal schauen ... nur als Hinweis: für den Code-Schnipsel, den ich gepostet hatte, brauchst Du keine RSAT. Es wird auch nur das Netzsegment gescannt und geprüft, ob die Datei auf dem Zielcomputer verfügbar ist oder nicht. Zitieren Link zu diesem Kommentar
testperson 1.707 Geschrieben 11. März 2021 Melden Teilen Geschrieben 11. März 2021 (bearbeitet) In meinem Ansatz wäre da nur noch ein wenig Invoke-Command und Get-Package notwendig und du hättest auch Java Installationen außerhalb der Program Files samt Version: $pkgJava = Invoke-Command -ComputerName $Computer.DNSHostname -ScriptBlock{ $pkg = Get-Package | where { $_.Name -match "Java [7-9] Update" } return $pkg } Ansonsten könnte man auch (remote) mit Get-CimInstance die Win32_Product Klasse befragen oder auch per .Net Object ([Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey) die Registry der entfernten PCs nach Java durchsuchen. Wenn ich jetzt die beiden PowerShell Ansätze sehe und das Konstrukt aus Batch, nunja.. Choose wisely. :) P.S.: Das ".Net Object" ist evtl. nichts für einen Einstieg in PowerShell. ;) bearbeitet 11. März 2021 von testperson 1 Zitieren Link zu diesem Kommentar
daabm 1.366 Geschrieben 11. März 2021 Melden Teilen Geschrieben 11. März 2021 vor 20 Stunden schrieb stefan4711: das Ergebnis sieht nun wie folgt aus "Stuck in batch" SCNR... 1 Zitieren Link zu diesem Kommentar
stefan4711 3 Geschrieben 11. März 2021 Autor Melden Teilen Geschrieben 11. März 2021 stuck was? egal, bestimmt ne Floskel, wie ach wie furchbar, es tut aber was es soll, und ich steige durch, mir geht es ebenfalls so, beim Betrachten des Codes von anderen, dass ich nicht durchsteige, von daher seh ich das nicht als Beleidigung;) Mit dem Powershell werde ich mich, sofern Zeit ist mal näher mit beschäftigen, meistens höre ich immer nur nimm Powershell, aber zumeist bleibt es bei diesem Spruch, Ich werde für so einen kleinen Anwednungs-Fall beim guten alten Batch bleiben, und nicht mit Kanonen auf Spatzen schiessen, wie würde denn dein Code aussehen daabm, mal interessehalber gefragt? Ich will da keine Anwendungen mit schreiben. Jetzt mögen vielleicht viele sagen, dass es bald nur noch Powershell gibt, ich persönlich habe davon jedenfalls noch nichts offizielles gelesen. lg Stefan Zitieren Link zu diesem Kommentar
MurdocX 953 Geschrieben 11. März 2021 Melden Teilen Geschrieben 11. März 2021 (bearbeitet) vor 18 Minuten schrieb stefan4711: stuck was? egal, bestimmt ne Floskel, wie ach wie furchbar, es tut aber was es soll, und ich steige durch, mir geht es ebenfalls so, beim Betrachten des Codes von anderen, dass ich nicht durchsteige, von daher seh ich das nicht als Beleidigung;) Heist was wie „Hängt fest in... / Verloren in... Batch“. :) vor 18 Minuten schrieb stefan4711: Mit dem Powershell werde ich mich, sofern Zeit ist mal näher mit beschäftigen, meistens höre ich immer nur nimm Powershell, aber zumeist bleibt es bei diesem Spruch Siehe von den Kollegen oben. vor 18 Minuten schrieb stefan4711: Ich werde für so einen kleinen Anwednungs-Fall beim guten alten Batch bleiben, und nicht mit Kanonen auf Spatzen schiessen In der Regel sind die langen und komplizierten Batch-Skripte in der Powershell ein Einzeiler In dem Fall würde man mit Spazen auf Kanonen schießen bearbeitet 11. März 2021 von MurdocX 1 Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 11. März 2021 Melden Teilen Geschrieben 11. März 2021 (bearbeitet) vor 2 Stunden schrieb stefan4711: ... beim Betrachten des Codes von anderen, dass ich nicht durchsteige ... ... na da können wir doch auch helfen .... 2..254 | ForEach-Object { $IPAddress = "192.168.178.$_" $TargetPath = "\\$IPAddress\c$\Program Files (x86)\Prg\aktvers.txt" [PSCustomObject]@{ IPAddress = $IPAddress FileExists = If (Test-Connection -ComputerName $IPAddress -Count 1 -Quiet) { Test-Path -Path $TargetPath } else { 'n/a' } } } Es sind zwar keine Zeilennummern dran, aber bei 9 oder eigentlich nur 7 Zeilen Code, wählen wir einfach mal manuell ... In Zeile 1 wird eine Liste von Elementen erzeugt, die die Zahlen 2 bis 254 enthält. Danach wird mittels der pipe ein Element nach dem anderen an das nächste cmdlet weitergeleitet. In Zeile 2 wird eine Schleife erzeugt, die für jedes einzelne Element aus der Pipeline die gleichen Befehle abarbeitet. Also alle Befehle, die innerhalb der geschweiften Klammern stehen. In Zeile 3 wird aus einer Vorlage mit den ersten 3 Oktetts und der aus der pipe entnommenen Zahl eine IP-Adresse gebildet und diese in einer Variable gespeichert. In Zeile 4 wird mit dieser Variablen und dem Rest eines UNC-Pfades der Zielpfad der gewünschten Datei zusammengebaut und in einer Variablen gespeichert. (Zeile 3 und 4 sind prinzipiell zwar nicht nötig, dienen aber hier ein wenig der Lesbarkeit.) Zeile 5 enthält die Deklaration eines Ausgabe-Objects mit den in den folgenden Zeilen definierten Eigenschaften. Zeile 6 definiert die Eigenschaft "IPAddress" und weißt ihr den Wert der Variablen "$IPAddress" zu. Zeile 7 definiert die Eigenschaft "FileExist" und weißt ihr das Ergebnis einer geschachtelten Abfrage zu. Zeile 8 und 9 sind die schließenden Klammern für das Object und die Schleife. Die geschachtelte Abfrage in Zeile 7 testet innerhalb der Bedingung, die durch das "if"-Schlüsselwort definiert wird, ob der Zielcomputer erreichbar ist - also quasi ein Ping. Ist das der Fall prüft der nächste Befehl innerhalb des Scriptblocks, ob die Datei deren Pfad in der Variablen "$TargetPath" gespeichert ist, vorhanden ist. Ist sie das, wird ein "$True" zurückgegeben. Ist sie das nicht, kommt ein "$false". Sollte die Prüfung auf Erreichbarkeit der IP-Adresse fehlschlagen, wird der zweite kleine Scriptblock ausgeführt und einfach ein "n/a" ausgegeben. Wenn man ein wenig englisch spricht, könnte man sich den größten Teil dieser Erklärung eigentlich schon selbst zusammengereimt haben. Powershell-cmdlet sind meist deutlich "beschreibender" als die Befehle anderer Script-Sprachen. Test-Connection oder Test-Path sind ziemlich unzweideutig, wie ich finde. Wenn Du beruflich in Windows-System-Umgebungen unterwegs bist und das auch noch ne Weile tun möchtest, glaube ich, dass Du Dir mit dem Erlernen von Powershell auf jeden Fall das Leben ein wenig erleichtern würdest und dass es sich für Dich auszahlt. Das eigentlich clevere an Powershell ist, dass Du das Ergebnis des obigen Scriptes sehr einfach weiterverarbeiten kannst, da es sich um Objekte mit Eigenschaften handelt. Du kannst es z.B. filtern und nur noch die IP-Adressen ausgeben, die erreichbar waren, oder nur noch die, die erreichbar waren und die Datei nicht vorhanden war. Oder Du könntest das Ergebnis z.B. mit einem einzigen Befehl in eine CSV-Datei schreiben. Edit: ... und nur weils auch mal Spaß macht ... wenn man es unbedingt schlecht lesbar und ein bssil kryptisch haben möchte, weil das vielleicht die etwas unbedarften Kollegen mehr beeindruckt, kann man mit Powershell auch das machen: foreach($i in (2..254)){[PSCustomObject]@{IP="192.168.178.$i";File=If(Test-Connection "192.168.178.$i" -Cou 1 -Q){Test-Path "\\192.168.178.$i\c$\Program Files (x86)\Prg\aktvers.txt"}else{'n/a'}}} Diese eine Zeile tut im Wesentlichen das Gleiche. bearbeitet 11. März 2021 von BOfH_666 2 Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.