![Die Verwendung von „Ping“ und „Findstr“ in einer „For“-Schleife einer Batchdatei führt zunächst zu einem Fehler (kein interner externer Befehl), zeigt aber erneut eine Ausgabe an.](https://rvso.com/image/1671509/Die%20Verwendung%20von%20%E2%80%9EPing%E2%80%9C%20und%20%E2%80%9EFindstr%E2%80%9C%20in%20einer%20%E2%80%9EFor%E2%80%9C-Schleife%20einer%20Batchdatei%20f%C3%BChrt%20zun%C3%A4chst%20zu%20einem%20Fehler%20(kein%20interner%20externer%20Befehl)%2C%20zeigt%20aber%20erneut%20eine%20Ausgabe%20an..png)
Diese Batchdatei
@echo off
set path=C:\Users\ssiyengar\Desktop\Pingtest\pinglist.csv
set file=C:\Users\ssiyengar\Desktop\Pingtest\temp.txt
set qosping=1
cls
for /f "tokens=1-3 delims=," %%a IN (%path%) do (
ping %%c -n %qosping% > %file%
findstr "time< time=" %file% >nul
if %errorlevel%==1 (
echo %%a %%b IP %%c Ping FAILURE
) else (
echo %%a %%b IP %%c Ping SUCCESS
)
)
pause
Ausgänge:
'ping' is not recognized as an internal or external command,
operable program or batch file.
'findstr' is not recognized as an internal or external command,
operable program or batch file.
SYS1 MC1 IP XX.XX.XX.XX Ping SUCCESS
Die CSV-Datei ist:
SYS1,MC1,IP1 \
SYS2,MC2,IP2
Warum ist Ping/Suchenicht erkannt?
Wenn ich die Werte direkt übergebe, statt aus der CSV-Datei, funktioniert es einwandfrei. Warum? Wie kann ich das Problem beheben?
Hinweis: Die Umgebungsvariablen enthalten bereits den Pfad von Sys32
.
Antwort1
Das Problem besteht darin, dass Sie den Pfad festlegen. Der Pfad ist eine spezielle Umgebungsvariable, die Pfade zu Speicherorten mit Programmen wie Ping und Findstr enthält.
Durch die Eingabe von set path=... überschreiben Sie diese Liste mit einer Datei, die den Pfad für die aktuelle Ausführungszeit löscht. Glücklicherweise ändert die Verwendung von set die Variable nur während der Laufzeit dieses Skripts und nicht für alle Sitzungen. Aus diesem Grund funktioniert es immer noch, wenn Sie zu cmd gehen und ping mit den Werten aus der CSV-Datei eingeben.
Wenn Sie die Zeile „set path=“ in derselben Befehlssitzung eingeben, funktioniert auch das manuelle Eintippen der Werte nicht mehr, bis die Befehlssitzung geschlossen und erneut geöffnet wird.
Wenn Sie: set path=
in set mypath=
und %path%
in ändern %mypath%
, funktioniert Ihr Skript.
Antwort2
ImSystemvariablenSie haben bereits eine Variable mit dem Namen path,
sie verweist auf mehrere Pfade, in denen der Befehlsinterpreter (cmd.exe)
sucht und führt Ihre Befehle aus und sucht nach Dateien mit den
inPfaderweiterung, und wenn es nicht gefunden wird, wird Folgendes zurückgegeben:
- „Ping“ wird nicht als interner oder externer Befehl, ausführbares Programm oder Batchdatei erkannt.
- „findstr“ wird nicht als interner oder externer Befehl, ausführbares Programm oder Batchdatei erkannt.
Ich schlage vor, dass Sie die Namen der Variablen kennen und beginnen, andere Namen zu verwenden.
Antwort3
Sie können es folgendermaßen versuchen und müssen auch keine temporäre Datei erstellen:
@echo off
Title Ping Tester
set "My_CSV_PingList=%~dp0pinglist.csv"
set qosping=1
set "LogFile=%~dp0PingResults.txt"
If exist "%LogFile%" Del "%LogFile%"
cls
SetLocal EnableDelayedExpansion
for /f "tokens=1-3 delims=," %%a IN (%My_CSV_PingList%) do (
Ping -n %qosping% %%c |find "TTL=">nul) && (
set "msg=%%a %%b IP %%c Ping SUCCESS" && echo !msg!
echo !msg!>>"%LogFile%"
) || (
set "msg=%%a %%b IP %%c Ping FAILURE" && echo !msg!
echo !msg!>>"%LogFile%"
)
)
EndLocal
Start "Log" /MAX "%LogFile%"
pause
Bonus:Informationen zur Verwendung finden Siemehrere Farben im BatchSie können die Nachricht in Grün anzeigen, wennErfolgund eine rote Farbe, wennVersagen.
@echo off
Title Ping Tester With Powershell Foreground Colors In A Batch File
set "My_CSV_PingList=%~dp0pinglist.csv"
set qosping=1
set "LogFile=%~dp0PingResults.txt"
If exist "%LogFile%" Del "%LogFile%"
cls
SetLocal EnableDelayedExpansion
for /f "tokens=1-3 delims=," %%a IN (%My_CSV_PingList%) do (
Ping -n %qosping% %%c |find "TTL=">nul) && (
set "msg=%%a %%b IP %%c Ping SUCCESS" && Call :PSColor "!msg!" Green \n
echo !msg!>>"%LogFile%"
) || (
set "msg=%%a %%b IP %%c Ping FAILURE" && Call :PSColor "!msg!" Red \n
echo !msg!>>"%LogFile%"
)
)
EndLocal
Start "Log" /MAX "%LogFile%"
pause
Exit /B
::---------------------------------------------------------------
:PSColor <String> <Color> <NewLine>
If /I [%3] EQU [\n] (
Powershell Write-Host "`0%~1" -ForegroundColor %2
) Else (
Powershell Write-Host "`0%~1" -ForegroundColor %2 -NoNewLine
)
Exit /B
::--------------------------------------------------------------
Antwort4
Verwenden Sie nicht mehr die veraltete Eingabeaufforderung, sondern stattdessen PowerShell.
$hosts = Import-CSV pinglist.csv
$hosts | Foreach-Object {
$result = (Test-NetConnection -ErrorAction SilentlyContinue `
-WarningAction SilentlyContinue -InformationLevel Quiet $_.IP) ? "SUCCESS" : "FAILURE"
Write-Host ("{0} {1} IP {2} {3}" -f $_.Name,$_.mc,$_.IP,$result)
}
Sie müssen Ihrer CSV eine Kopfzeile hinzufügen, um die Attributnamen pro Zeile zu erhalten:
Name,mc,IP