Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Batch - Prüfen ob erstes Zeichen einer Variable eine Zahl ist

Frage Entwicklung Batch & Shell

Mitglied: leb0rtran

leb0rtran (Level 1) - Jetzt verbinden

28.11.2008, aktualisiert 29.11.2008, 12510 Aufrufe, 10 Kommentare

Hi,

ich will per Batch Prüfen ob das erste Zeichen einer Variable eine Zahl ist.

also einfach

if erstes zeichen von %bla% ist eine zahl (
echo zahl
) else (
echo keine zahl
)

weiß jemand wie das geht?

Schonma Vielen Dank für hilfen.

MFG
Mitglied: 60730
28.11.2008 um 15:15 Uhr
Servus,

so ganz banal würde ich das so (unelegant und ungetestet) lösen wollen.

01.
set "tmp1=%bla:~-,1%" 
02.
set /a "tmp2=%bla:~-,1%" 
03.
if &tmp1%==%tmp2% Echo erstes zeichen von %bla% ist eine zahl
Was natürlich nur dann funktionieren sollte, wenn %bla% nicht Null ist...

Gruß
Bitte warten ..
Mitglied: Biber
28.11.2008 um 15:53 Uhr
Moin leb0rtran,

das würde ich im Batch genau wie auch in strukturierteren Skriptsprachen mit einen ganz banalen Textvergleich machen.

Wenn erstes Zeichen größer gleich "0" und kleiner gleich "9", dann ist es eine Ziffer.
01.
IF "%var:~0,1%" GEQ "0" IF "%var:~0,1%" LEQ "9" @Echo Var ist eine Ziffer
Grüße
Biber
Bitte warten ..
Mitglied: leb0rtran
28.11.2008 um 16:13 Uhr
ok,

ne weitere Frage hätte ich noch:

Mit dem Script lese ich Dateien ein, in denen IPs gespeichert sind (zeilenweiße)
Das Zeilenweiße auslesen mach ich atm so

01.
FOR /F "delims=" %%i IN (%file%) DO call :Zeile "%%i" 
02.
... 
03.
:eof 
04.
 
05.
:Zeile 
06.
SET /A i=i+1 
07.
if "%~1" == "%ip%" set ipzeile=%i% 
08.
:eof
alos, hier wird einfach nur gezählt wieviele zeilen die Datie hat (durch die if abfrage sollen dann nurnoch Zeilen gezählt werden, die eine IP enthalten)
danach wird geprüft ob die IP einer schon angegebenen IP entspricht und dann die Zeile gespeichert.

Das Problem ist, wenn die Datei viele Zeilen hat (habs mit 60.000 getestet), braucht das script schon recht lange, so ca ~30s geschätzt.
Kann man das performanter gestalten?
und welche der beiden obrigen Lösungen ist denn performanter?

edit:
Oder geht das per Batch nich schneller?

edit2:
bei der lösung von Biber is mir grad aufgefallen, dass wenn eine Zeile aus ---------- besteht, die auch angezeigt wird
Bitte warten ..
Mitglied: Biber
28.11.2008 um 16:38 Uhr
Moin leb0rtran,

gut, dass Du noch mal nachfragst.
Ich habe es diese Woche schon mal in einem anderen Beitrag geschrieben:
die richtige, aber rein "handwerkliche" Beantwortung ("Welche Syntax muss ich nehmen für...?") einer Frage ist meistens zu kurz gegriffen für eine Lösung. Meist ist ja der Kontext entscheidend für die Wahl einer Lösungsstrategie.

Bei Deinem Problem ginge es VIEL schneller, wenn Du ein Tool verwenden würdest, das Dir ratzfatz die Zeilen zählen kann und eines, das Dir nur die Zeilen, die mit einer Ziffer beginnen, rausflöhen kann.
Dann hast Du ja möglicherweise nur noch 10000 der 60000 Zeilen zu "prüfen".

Beides kann FindStr.exe. (ist auf Deinem Rechner).

Nur Alle Zeilen aus Deiner Ipkrams.txt, die mit einer Ziffer 0-9 beginnen(hier mit Zeilennummer):
findstr /n /R "^[0-9].*" ipkrams.txt
Und einfach alle Zeilen zählen ginge so bsp. am CMD-Prompt):
01.
for /f "delims=:" %i in ('findstr /n $ ipkrams.txt') do @set "linesCount=%i" 
02.
--> linesCount=60016
Grüße
Biber
Bitte warten ..
Mitglied: 60730
28.11.2008 um 16:55 Uhr
Servus again,
edit2:
bei der lösung von Biber is mir grad aufgefallen,
01.
 findstr /n /R "^[0-9].*" ipkrams.txt 
dass wenn eine Zeile aus ---------- besteht, die auch angezeigt wird

Dann halt "so" herum

findstr /n "0 1 2 3 4 5 6 7 8 9" ipkrams.txt

Gruß
Bitte warten ..
Mitglied: leb0rtran
28.11.2008 um 17:08 Uhr
01.
for /f "delims=:" %%i in ('findstr /n /R "^[0-9].*" %file%') do @set "count=%%i" 
Hab ich ma getestet, aber damit werden alle Zeilen gezählt bis zur letzten IP (Zeile die eine Zahl am Anfang hat). Also bei zB

blub
123.123.123.132
bla ---
3.3.3.3:20
bla

kommt 4 raus, richtig wäre aber 2


Und was mir unerklärlich ist, warum wird die letzten Zeile mit nem Doppelpunk an die Zahl hintenangehängt, wenn ich "delsim=" statt "delsim=:" schreib?
Bitte warten ..
Mitglied: Biber
28.11.2008 um 17:15 Uhr
Hmm,

hab ich nicht verstanden, das mit der "--------" Zeile.
Die Ausgabe von "net user" enthält definitiv und reproduzierbar eine solche "---" Zeile.
Wenn ich diese Ausgabe mit meinem Findstr-Ausdruck abgrasen lasse, findet er nix.
01.
 net user>test777.txt 
02.
findstr /n  /R "^[0-9].*" test777.txt 
03.
-## oder gleichwertig folgende Syntax ##- 
04.
findstr /n /b /R "[0-9].*" test777.txt 
05.
{findet nix; keine Ausgabe} 
06.
echo 1233>>test777.txt 
07.
findstr /n /b /R "[0-9].*" test777.txt 
08.
9:1233     ---------> works as designed...
Verwundert
Biber
Bitte warten ..
Mitglied: leb0rtran
28.11.2008 um 17:44 Uhr
Schonam Danke für eure mühe,

nachdem ich nu die Lösung von Biber n bissle näher angeschaut hab, udn die auch verstanden hab, bringt die mir 0 geschwindigkeitsvorteil, liegt zum teil auch daran, dass eig fast alle Zeilen IPs sin, andere Zeilen sind die Aussnahme.

Neue Idee die ich hatte, die auch etwas besser ging:
einfach die Letzte Zeilennummer angeben (is zwar ungenauer aber bei mehr als 10k Zeilen is das Wayne ...
und dann einfach die Zeilennummer mit der IP ausgeben.
Nur wie speichere ich das Ergebniss von findstr?

01.
:: RegEx pattern für eine IP 
02.
set patternIP=[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} 
03.
 
04.
:: IP auslesen - liest die IP aus einer Datei aus 
05.
set IP=findstr /R "%pattern%" ip.txt 
06.
 
07.
:: Datei auslesen 
08.
set zeile=findstr /n /R "^[0-9].*" %file% 
09.
set zeileip=findstr /n /L "%IP%%" %file%
Bitte warten ..
Mitglied: Biber
28.11.2008 um 18:03 Uhr
Ach soooooooo, leb0rtran,

jetzt [edit] bezogen auf den Post direkt über diesem [/edit] versteh ich, warum wir zu unterschiedlichen Ergebissen kommen.

Oben sprach ich von ZWEI Aktionen
  • erstens ALLE Zeilen zählen (anzahl zeilen der Textdatei). Dafür brauchst Du den "FindStr /n $" -Befehl
  • zweitens einen FindStr-befehl, der Dir wirklich die Zeilen filtert, d.h. der Dir nur die mit einer Ziffer beginnenden zeilen liefert.

Nochmal zur Verdeutlichung: wenn Du die Anzahl zeilen wissen willst, die mit einer Ziffer anfangen:
01.
>type ipkrams.txt 
02.
blub 
03.
123.123.123.132 
04.
bla --- 
05.
3.3.3.3:20 
06.
bla 
07.
 
08.
>findstr /n /b /R "[0-9].*" ipkrams.txt 
09.
2:123.123.123.132 
10.
4:3.3.3.3:20 
11.
 
12.
>for /f "delims=:" %i in ('findstr /n /b /R "[0-9].*" ipkrams.txt') do set /a cnt+=1 
13.
2 <---------------Ergebnis: 2 Zeilen as should do
Wenn Du die eigentlichen Zeilen noch betrachten,/verarbeiten willst, also z.B. wie in Deinem allerersten Ansatz an eine Call:Routine weitergeben willst:
01.
>for /f "tokens=1* delims=:" %i in ('findstr /n /b /R "[0-9].*" ipkrams.txt') do @echo [%j] 
02.
[123.123.123.132] 
03.
[3.3.3.3:20]
Grüße
Biber
Bitte warten ..
Mitglied: leb0rtran
29.11.2008 um 14:53 Uhr
weiß den keiner wie das geht?
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Dateien umbenennen - ersten Zeichen entfernen (4)

Frage von jan999 zum Thema Batch & Shell ...

Batch & Shell
gelöst FOR Loop Variablen ( Batch ) (2)

Frage von clragon zum Thema Batch & Shell ...

Batch & Shell
gelöst PowerShell: Umbenennung erster 2 Zahlen (1)

Frage von janelsaesser zum Thema Batch & Shell ...

Batch & Shell
Zu viele Variablen in Batch-Script? Speicherproblem? (2)

Frage von dolsch zum Thema Batch & Shell ...

Neue Wissensbeiträge
Ubuntu

Ubuntu 17.10 steht zum Download bereit

(3)

Information von Frank zum Thema Ubuntu ...

Datenschutz

Autofahrer-Pranger - Bewertungsportal illegal

(8)

Information von BassFishFox zum Thema Datenschutz ...

Windows 10

Neues Win10 Funktionsupdate verbuggt RemoteApp

(8)

Information von thomasreischer zum Thema Windows 10 ...

Microsoft

Die neuen RSAT-Tools für Win10 1709 sind da

(2)

Information von DerWoWusste zum Thema Microsoft ...

Heiß diskutierte Inhalte
Router & Routing
Allnet - VDSL2 Modem - SFP (mini-GBIC) (20)

Frage von Dobby zum Thema Router & Routing ...

Monitoring
Netzwerk-Monitoring Software (18)

Frage von Ghost108 zum Thema Monitoring ...

Windows 10
Seekrank bei Windows 10 (17)

Frage von zauberer123 zum Thema Windows 10 ...

Windows Server
gelöst Kopiervorgang schlägt fehl, weil Datei- und Ordnername zu lang sind (14)

Frage von Schroedi zum Thema Windows Server ...