CMD, Errorlevel Findstrg entspricht nicht den Erwartungen
WIN10
Commandline /Batch
Hallo Leute
ich versuche gerade wieder mit Findstr in einer Batch Ergebnisse zu erzielen.
Findstr soll eine txt nach einem genauem Muster durchsuchen und ich will dann den ERRORLEVEL weiter verarbeiten:
Wenn ERRORLEVEL is NOT == 0 dann...
Die Daten im zu durchsuchendem txt liegen im Format
Vorname - Name
vor
Das Trennzeichen ist jeweils der Bindestrich.
Aktuell versuche ich es mit folgender Syntax in einer Batch:
Da der Suchstring xxx nicht im txt-File vorkommt ist die Errorlevelausgabe 1, somit nicht gefunden
Gebe ich stattdessen einen Suchstring ein der im txt-File vorhanden ist erhalte ich ebenfalls ERRORLEVEL 1 statt der erwarteten 0
Was mach ich hier grundlegend falsch?
Gruss Heinze
Commandline /Batch
Hallo Leute
ich versuche gerade wieder mit Findstr in einer Batch Ergebnisse zu erzielen.
Findstr soll eine txt nach einem genauem Muster durchsuchen und ich will dann den ERRORLEVEL weiter verarbeiten:
Wenn ERRORLEVEL is NOT == 0 dann...
Die Daten im zu durchsuchendem txt liegen im Format
Vorname - Name
vor
Das Trennzeichen ist jeweils der Bindestrich.
Aktuell versuche ich es mit folgender Syntax in einer Batch:
@echo on &setlocal EnableDelayedExpansion
Set "gesucht=xxx"
findstr /ic:%gesucht% "G:\_AA-KCCNsuche\005_SortUniq-v003.txt"
Echo originalerrorl ---%ERRORLEVEL%
echo %gesucht%
Da der Suchstring xxx nicht im txt-File vorkommt ist die Errorlevelausgabe 1, somit nicht gefunden
Gebe ich stattdessen einen Suchstring ein der im txt-File vorhanden ist erhalte ich ebenfalls ERRORLEVEL 1 statt der erwarteten 0
C:\Windows\System32>G:\_AA-KCCNsuche\007_sucheIn005.bat
C:\Windows\System32>Set "gesucht=Ana"
C:\Windows\System32>findstr /ic:Ana "G:\_AA-KCCNsuche\005_SortUniq-v003.txt"
C:\Windows\System32>Echo originalerrorl ---1
originalerrorl ---1
C:\Windows\System32>echo Ana
Ana
Was mach ich hier grundlegend falsch?
Gruss Heinze
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 3574426956
Url: https://administrator.de/contentid/3574426956
Ausgedruckt am: 25.11.2024 um 10:11 Uhr
9 Kommentare
Neuester Kommentar
Was zur Hölle ... ? Hast du hier versucht Text in Codetags fett hervorzuheben oder hast du das wirklich so im Code stehen?
Normalerweise erzählen dir einigermaßen moderne Texteditoren in der Statusleiste welche Zeichencodierung eine Datei hat. Egal. Ich gehe immer noch davon aus dass es UTF-16 ist, wo bspw. ein "Z" nicht einfach nur das Byte 5A ist, sondern durch 2 Bytes 5A 00 repräsentiert wird. Ein Tool wie findstr.exe erwartet aber mit ANSI gefüttert zu werden und wird somit UTF-16 nicht so verarbeiten, wie du hoffst. Ist halt so wenn man unbedingt noch mit Batch herumwerkeln will.
Workaround: Du musst eine Konvertierung vornehmen. Das TYPE Kommando macht das für dich. Den resultierenden Textstream leitet man per Pipe an FINDSTR.
Steffen
Normalerweise erzählen dir einigermaßen moderne Texteditoren in der Statusleiste welche Zeichencodierung eine Datei hat. Egal. Ich gehe immer noch davon aus dass es UTF-16 ist, wo bspw. ein "Z" nicht einfach nur das Byte 5A ist, sondern durch 2 Bytes 5A 00 repräsentiert wird. Ein Tool wie findstr.exe erwartet aber mit ANSI gefüttert zu werden und wird somit UTF-16 nicht so verarbeiten, wie du hoffst. Ist halt so wenn man unbedingt noch mit Batch herumwerkeln will.
Workaround: Du musst eine Konvertierung vornehmen. Das TYPE Kommando macht das für dich. Den resultierenden Textstream leitet man per Pipe an FINDSTR.
type "G:\_AA-KCCNsuche\005_SortUniq-v003.txt"|findstr /ic:"%gesucht%"
Steffen
sort /u ...
/U
ist die Kurzform der undokumentierten Option /UNI_OUTPUT
. Die erzeugt eine Ausgabe in Unicode (was in der Microsoftsprache so viel wie UTF-16 heißt). Die Ausgabe wird in dem Fall ohne vorangestelltes Byte Order Mark geschrieben. Daran verschluckt sich mglw. das TYPE Kommando und das ist evtl. auch der Grund warum dir NP++ kein Charset anzeigt.Ich vermute du wolltest eigentlich mit Option
/UNIQUE
ran. Die Kurzform dafür wäre allerdings /UNIQ
und nicht /U
.Steffen
Naja, jetzt bist du im Rumpf einer Schleife. Variablen in einer Kommandozeile oder einem in Klammern eingefassten Block von Kommandozeilen (wie bspw. deinem Schleifenrumpf) werden nur einmal zu ihrem Wert erweitert. Und das noch vor der Ausführung der Zeile / des Blocks. Um diese frühe Variablenerweiterung zu umgehen, schaltet man die verzögerte Variablenerweiterung mit
ein (hast du gemacht) und nutzt umschließende Ausrufezeichen statt Prozentzeichen um die Variable zu expandieren (hast du bei der ERRORLEVEL Variable nicht getan).
Übrigens: Sauberes Einrücken von Code hilft enorm bei der Lesbarkeit und somit auch dabei zu erkennen, wo du dich in einem Block befindest.
Steffen
setlocal EnableDelayedExpansion
ein (hast du gemacht) und nutzt umschließende Ausrufezeichen statt Prozentzeichen um die Variable zu expandieren (hast du bei der ERRORLEVEL Variable nicht getan).
Übrigens: Sauberes Einrücken von Code hilft enorm bei der Lesbarkeit und somit auch dabei zu erkennen, wo du dich in einem Block befindest.
for %%i in (Liste) do (
mach was mit Element %%i
mehr ...
if Bedingung (
mach was wenn Bedingung wahr ist
mehr ...
) else (
mach was wenn Bedingung falsch ist
mehr ...
)
mehr ...
)
Steffen
ich halte es da so lieber wie in deinem Post
Dann wärst du an diesem Punkt aber längst bei PowerShell.<"!Playliste!" >"G:\_AA-KCCNsuche\unbekannteSongs.txt" (
for /f %%i in ('type "!Playliste!"^|find /c /v ""') do for /l %%j in (1 1 %%i) do (
set "suchstring=" &set /p "suchstring="
if defined suchstring (findstr /ic:"!suchstring!" !fertigeSongs! >nul || echo !suchstring!)
)
)
Steffen