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 Stringlänge bestimmen (zB. Zeilenlänge, Offset von Zeichen, Spaltenanzahl)

Tipp Entwicklung Batch & Shell

Mitglied: pieh-ejdsch

pieh-ejdsch (Level 2) - Jetzt verbinden

06.08.2012, aktualisiert 23:50 Uhr, 12888 Aufrufe, 1 Kommentar, 1 Danke

Zum bestimmen von Zeichenlängen gibt es schon meherere Varianten.
Wie die Einzelnen Zeichen von der Variable abgeschnitten werden oder der Offset über findstr bestimmt wird (mit temporären Scripten) oder gar eine Temporäre Datei in der Größe bemessen wird.
Hier wird eine Weitere Variante erläutert.



Hallo Admins,

Der CMD gibt in der Hilfe eine WahlOption /Ansi oder /Unicode für Umleitungen von Ausgaben parat.

Da bei Unicode doppelt so viele Zeichen (immer mit Leerschritt) ausgegeben werden und Find sowie more dies als einzelne Zeilenangaben betrachten, werden somit die Zeichen Zeilenweise ausgegeben.

Die CMD mit aktivierter Verzögerung (enable delayedexpansion) kann aber durch eine Befehlverkettung oder Umleitung nicht richtig Verzögert auflösen. Bei deaktivierter Verzögerung klappt dies.

Stringlänge einer Variable

cmd /u /von /c "echo !path!"|find /v ""|findstr .|find /c /v ""
Find gibt die Unicodeausgabe Zeichen für Zeichen je Zeile aus.
Beim Pipen aus der CMD-Instanz muss nachher mit Findsrt . der Klartext gefiltert werden sonst stehen zwei oder drei Zeichen/Zeilen zuviel da.
Dandach wird die Stringlänge mit Find bestimmt.

01.
@echo off 
02.
for /f delims^= %%i in (' cmd /u /von /c "echo !path!"^|find /v ""^|findstr .^|find /c /v "" 
03.
 ') do set /a Stringlength = %%i 
04.
echo Stringlänge ist %Stringlength%

Offset von Zeichen anzeigen

cmd /u /c "type D:\dieEinzeiligeTabelle.csv"| find /v ""|findstr /n ";"
Findstr bekommt dazu den Filter für den Delimiter.
In einer CSV ist zB. nicht jede Spalte mit einen Wert belegt aber es wird nur die vierte Spalte und die siebte Spalte als Wert gebraucht.
Dazu wird der Offset der Delimiter ausgelesen. (Offset ist in dem Sinne nicht der richtige Begriff, weil die Zählung schon mit 1 beginnt.) Die exakte Position in einer Variable ist
echo %Variable:~(WertFundstelle-1) ,1%
01.
@echo off 
02.
setlocal 
03.
 
04.
for /f usebackqdelims^= %%i in ("D:\DieTabelle.scv") do (set "Line=%%i" 
05.
  for /f "tokens=1,2delims=:" %%i in (' cmd /u /von /c "echo(!Line!"^|find /v ""^|findstr /n ";" ^|findsrt /n . ') do set /a OFF%%i = %%j 
06.
  set /a Off5 - = off4 
07.
  set /a Off8 - = off7 -1 
08.
  setlocal enabledelayedexpansion 
09.
  for /f "tokens=1-2" %%%i in ("!off4!,!off5! !off7!,!off7a!") do echo !Line:~%%i!!Line:~%%j! 
10.
  endlocal 
11.
)
Der erste Finstr (2. token) markiert den offset, der zweite Findstr (1. token) markiert die Fundnummer.
Mit off5 wird erst die Länge vom offset ausgerechnet inklusive dem Delimiter.
Bei off8 wird der Delimter aus der Stringlänge herausgerechnet.
Wenn kein achter delimiter da wäre, kann vor dieser Rechnung auf Existenz des Off8 geprüft werden.


Gruß Phil
Mitglied: rubberman
07.08.2012, aktualisiert um 20:14 Uhr
Hallo PH!

Dass find und more das NUL Zeichen als Zeilenumbruch interpretieren, war mir bis jetzt entgangen. Gut zu wissen
Du könntest evtl. noch 2 Pipes sparen. Ob das an der Perfomance etwas ändert, weiß ich allerdings nicht. Müsste man mal testen.
- snip -
01.
for /f eol^=^ 
02.
 
03.
^ delims^= %%i in (' cmd /u /von /c "echo !path!"^|find /v "" ') do set /a Stringlength += 1
- snip -
Diese merkwürdige Leerzeilen-Caret-Kombination setzt für EOL ein LineFeed-Zeichen und ersetzt somit das Semikolon als Standard-EOL. Somit werden per FOR /F Leerzeilen ignoriert, wobei Zeilen beginnend mit Semikolon trotzdem verarbeitet werden ...

Grüße
rubberman

[EDIT]Ups, da waren 2 Zeilen zu viel.[/EDIT]
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
gelöst Mehrere Grafiken mit Batch umbenennen (3)

Frage von SeraphinaJ zum Thema Batch & Shell ...

Batch & Shell
gelöst Zeilenumbruch-Zeilen-Vorschub entfernen? (Batch) (9)

Frage von clragon zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch: Textdatei Zeilenweise auslesen (2)

Frage von CreatorX zum Thema Batch & Shell ...

Batch & Shell
Verschachtelte For Schleife für Batch Neuling (3)

Frage von yperiu zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
TK-Netze & Geräte
gelöst Telefonanlage gesucht (37)

Frage von Xaero1982 zum Thema TK-Netze & Geräte ...

Windows Netzwerk
Anmeldung an Domäne schlägt oft fehlt (Fehlermeldung: falsches Passwort) (24)

Frage von harald.schmidt zum Thema Windows Netzwerk ...

Exchange Server
gelöst Wie freigegebenes Postfach immer als primäre Sendeadresse verwenden? (18)

Frage von Flinxit zum Thema Exchange Server ...

Microsoft Office
Outlook 2016 - Keine Mails sichtbar (nach Suche schon) (17)

Frage von Hirschix3 zum Thema Microsoft Office ...