Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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, 11869 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.

Mit freundlichen Grüßen
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 ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(2)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst Batch Abfrage Vergleiche mit Variable goto (4)

Frage von Zunaras zum Thema Batch & Shell ...

Batch & Shell
gelöst In Batch variable DOS-Funktion von "größer" und "kleiner" Zeichen unterdrücken (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch Variable auf 5 Zeichen begrenzen (5)

Frage von PinkFLuffyUnicorn zum Thema Batch & Shell ...

Batch & Shell
Batch-Variable nach Stichworten aus TXT Datei durchsuchen (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...