Jump to content

von mehereren Rechnern Textdatei auslesen


Recommended Posts

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

 

 

Link to post

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

 

  • Like 1
Link to post
Posted (edited)

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

Edited by stefan4711
Link to post

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

  • Like 1
Link to post
Posted (edited)

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

 

 

Edited by stefan4711
Link to post
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.

Edited by BOfH_666
Link to post

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

 

 

Link to post

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
        }
    }

 

Link to post
Posted (edited)

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

Edited by stefan4711
Link to post
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.

Link to post

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. ;)

Edited by testperson
  • Haha 1
Link to post

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

Link to post
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 :-) 

Edited by MurdocX
  • Like 1
Link to post
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. ;-) :achtung::thumb1:

Edited by BOfH_666
  • Like 2
Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...