bergur
Goto Top

Vergleich von zwei Strings

Guten Tag,

ich arbeite jetzt seit 4 Tagen mit Batch, hab nicht wirklich die Ahnung davon und es ist viel rumprobiererei.
Hab schon alle möglichen Tutorials vorallem auf http://www.robvanderwoude.com gelesen und die manuals in der cmd. Aber so richtig schlau geworden bin ich bei manchen Funktionen immernochnicht. Ist auch die erste Scriptsprache die ich benutze, manche Kommandos sind komplizierter als man sichs vorstellt o.O

Ich soll ein Batch erstellen um bestimmte Daten auszulesen und in eine Textdatei zu schreiben. Das ganze soll so ziemlich unter allen Systemen funktionieren deswegen möchte ich eine Abfrage welches Betriebssystem es ist einbauen,je nachdem ist dann das jeweilige Script zu verwenden. Hier benutze ich Win7 professional zum schreiben, werds dann später mit verschiedenen VM´s testen.

Ich dachte das mache ich einfach mit If, aber jedesmal bekomme ich
"ECHO ist ausgeschaltet (OFF).
Microsoft Windows 7 Professional bestätigt
Keine Instanzen verfügbar.
Der Befehl "else" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
"
wieso ist die if auswahl hier falsch? wieso kann else nicht gefunden werden, laut manual passt das doch?

hier mein Code inklusive Kommentare:
@Echo Off 
cls
SETLOCAL ENABLEDELAYEDEXPANSION
rem kp obs das braucht
TYPE NUL > c:/test1.txt 
rem --------------------
TYPE NUL > c:/name.txt 
rem -------------------- mittlerweile egal

rem ---------------------------------------------------------------------------------------------- 



setlocal enabledelayedexpansion
for /f "Tokens=* skip=1" %%a in ('wmic os get caption^') Do (  
	echo %%a
	rem echo nur zum testen
	for /f "Tokens=*" %%b in ("Microsoft Windows 7 Professional") do (  
	echo %%b bestätigt
	rem echo nur zum testen
		if /I 	%%a EQU %%b (
rem ----wieso geht das net?
			echo hurra es funktioniert
rem ---------------------------------------------------------------------------------------------- 
			wmic logicaldisk where "volumename=''" set volumename=test  
			rem setz den volumename auf "test" falls dieser im vorfeld nicht schon gesetzt ist  
				for /F "usebackq tokens=1,2,3,4,5,6 skip=1" %%i in (`wmic logicaldisk get systemname^,volumename^,name^,filesystem^,size^,freespace 2^>NUL`) do echo %%m,%%n,%%k,%%i,%%l,%%j) >> c:/test1.txt  
				rem fragt die daten ab und sortiert sie
			wmic logicaldisk where "volumename='test'" set volumename=''  
			rem ändert die volumenamen zurück auf den leeren wert
		
		)
		else (
		echo fuck
			)
	)
)
Manche echos sind natürlich nur zum testen;)
Vll ist ja auch allgemein was falsch.
Ich danke schonmal für die Antworten.

Bergur

[Edit Biber] Codeformatierung. [/Edit]

Content-Key: 204488

Url: https://administrator.de/contentid/204488

Ausgedruckt am: 29.03.2024 um 08:03 Uhr

Mitglied: Endoro
Endoro 05.04.2013 aktualisiert um 16:40:56 Uhr
Goto Top
Hallo Bergur,

ich hab das mal nachgestellt:

@echo off&setlocal
set a=Microsoft Windows 7 Professional
set b=Microsoft Windows 7 Professional

if %a% equ %b% (echo gleich) else echo Mist!

Output ist:
"Windows" ist syntaktisch an dieser Stelle nicht verarbeitbar.

Zwar kein Mist! aber mindestens Mist. Windows wird nicht verarbeitet!

Vorschläge?


Gruss!
Mitglied: Biber
Biber 05.04.2013 aktualisiert um 18:08:42 Uhr
Goto Top
Moin Endoro,

Zitat von @Endoro:
"Windows" ist syntaktisch an dieser Stelle nicht verarbeitbar.

das komische Wort "syntaktisch" müssten auch knapp 98% der anderen Windows-BenutzerInnen bei Google nachschlagen.
Mach dir nichts draus, wenn dir die Fehlermeldung nicht weiterhilft.


Wie wäre es so wie unten am CMD-Prompt vorgekaspert mit altmodischen Anführungszeichen?
D:\Biber\temp>set "a1=Microsoft Windows 7 Professional"  

D:\Biber\temp>set "a2=Microsoft Windows 7 Professional"  

D:\Biber\temp>if "%a1%"=="%a2%" echo [%a1%] und [%a2%] sind gleich  
[Microsoft Windows 7 Professional] und [Microsoft Windows 7 Professional] sind gleich

Grüße
Biber
Mitglied: Bergur
Bergur 08.04.2013 um 10:57:34 Uhr
Goto Top
Das funktioniert leider alles nochnicht. Ich denke das es an dem If liegt, bzw an der ersten variable "%%a"
...
for /F "Tokens=* skip=1" %%a in ('wmic os get caption') Do (   
	echo %%a
	rem echo nur zum testen
	for /f "Tokens=*" %%b in ("Microsoft Windows 7 Professional") do (  
	echo %%b bestätigt
	rem echo nur zum testen funktioniert
		if 	"%%a" == "%%b" ( echo hurra es funktioniert)  
...

ich frag mich schon ob if vll nur einzeilig geht, aber selbst so gibt er das "hurra es funktioniert" nicht aus, komischerweise auch nichtmehr die echos von weiter oben.
Irgenwas passt mit dem Vergleich nicht. Es gibt auch keine änderung ob ich jetzt "%%a == %%b" oder if /I "%%a EQU %%b" oder sämtliche kombinationen mit "'` oder sonstfür zeichen mache.
Mitglied: Biber
Biber 08.04.2013 aktualisiert um 15:34:40 Uhr
Goto Top
Moin Bergur,

das Problem liegt nicht an den Laufvariablen %%a %%b oder der FOR/F- oder der IF-Anweisung.

Die WMIC.exe liefert eine Zeile, die keinen vernünftigen Zeilenumbruch (CRLF) hat, sondern irgendeinen hingekasperten Zeilenabschluss der Form CRCRCRLF oder so ähnlich.
Daduch wird die Stringlänge falsch berechnet.

Kannst du am CMD-Prompt sehen, indem du die vermeintliche "Zeile" in eine Laufvariable packst und diese mit einem Zeichen danach ausgeben lässt.
C:\Users\MeinUser>for /f "delims== Tokens=1 skip=1" %a in ('wmic os get caption') Do @echo %a.
.icrosoft Windows 7 Enterprise

-> alles, was du nach "%a" eigibst, überschreibt die ersten Zeichen des Strings.

Workaround:
C:\Users\DeinUser>for /f "Tokens=1-4 skip=1" %a in ('wmic os get caption') Do @if "Microsoft Windows 7 Professional"=="%a %b %c %d" @echo ist ein Windows 7 Professional
ist ein Windows 7 Professional

Grüße
Biber
Mitglied: Bergur
Bergur 08.04.2013 um 14:09:13 Uhr
Goto Top
danke
das mit dem ersten zeichen ist mir schon aufgefallen ich dachte das würde an irgendeinem escapezeichenbug liegen
ich bastel jetzt mal bisschen dran mal sehn obs dann geht.
Mitglied: Endoro
Endoro 08.04.2013 aktualisiert um 18:04:39 Uhr
Goto Top
Hallo Bergur,

idR wird der zusätzliche "CR" mit einer weiteren Forschleife aufgefangen. Scheint aber nicht bei allen zu klappen (Windows-Versionsabhängig?):
for /f "delims=" %%A in ('wmic os get caption') do for /f "delims=" %%B in ("%%A") do echo(%%B  

ansonsten könntest du noch das versuchen:

for /f "delims=" %%A in ('wmic os get caption') do cmd /c echo(%%A  

oder auch das:
for /f "delims=" %%A in ('wmic os get caption') do set "z=%%A" & echo(!z:~0,-1!  


Gruss!
Mitglied: Biber
Biber 08.04.2013 aktualisiert um 19:07:29 Uhr
Goto Top
Moin Endoro,

ja, im Prinzip schon, aber...

...durch diesen verhunzten Zeilenabschluss sind
1) vor dem "gefundenen" CRLF noch 3 nicht verwertbare Zeichen und nicht eines.
2) wird sogar wenn du die WMIC-Ausgabe durch ein find/findstr "Windows" jagst, eine Doppelzeile für die gefundene Zeile mit dem Text "Windows" angezeigt.

Punkt 1 kannst du überprüfen, wenn du mal die WMIC-Ausgabe in eine Datei umleitest
wmic os get caption>%temp%\WmicOutput.txt
und mal in einem handelsüblichen Texteditor an das Zeilenende springst.

Punkt zwei ist noch amüsanter:
C:\Temp>for /f "delims=" %i in ('wmic os get caption^|findstr "Windows"') do @echo [%i und nochwas
und nochwasindows 7 Enterprise

Natürlich kannst du das mit einem Einzeiler geraderücken...
C:\Temp>@setlocal enabledelayedexpansion & @for /f "delims=" %A in ('wmic os get caption') do @set "z=%A" & @if "!z:~0,-3!"=="Microsoft Windows 7 Enterprise" echo Tadaaa: issn Windows 7 Enterprise!
Tadaaa: issn Windows 7 Enterprise!

aber ob das wartbarer ist als der von mir angebotene Workaround...?

Ich sach' ma' so:
Deine Variante geht immerhin schneller und stressärmer als einen Bug bei M$ zu melden und eine Behebung einzufordern.

Aber ist stressiger als die Ersetzung der Batch/WMIC-Abfrage durch einen Powershell-Oneliner oder einen VBS-Schnipsel.

Grüße
Biber
Mitglied: Endoro
Endoro 08.04.2013 aktualisiert um 19:30:36 Uhr
Goto Top
Hallo Biber,
danke für die Info.
Was ich noch vergessen hab, mit der Option /Format:csv soll es angeblich besser sein.

Ansonsten hast du recht, ich will nicht drei extra Forschleifen bauen, um sauberen Input zu bekommen. WMIC ist nix für Batcher face-smile


Gruss!
Mitglied: Bergur
Bergur 09.04.2013 aktualisiert um 08:58:50 Uhr
Goto Top
Wie muss ich das denn alles anpassen damits auch aus ner Batch heraus läuft? also zb den Workaround von Biber. Krieg da immer Syntaxfehler bzw "a" kann syntaktisch an dieser Stelle nicht verarbeitet werden.
Warscheinlich weil doch in ner batch eig 2 % vor der Variable sein müssten, aber wennichs ändere krieg ich syntaxfehler.
Mitglied: Biber
Biber 09.04.2013 aktualisiert um 09:20:10 Uhr
Goto Top
Moin Bergur,

doch, die Variante im Batch hat als einzige Anpassung die Ersetzung der einfachen Prozentzeichen (%a, %b ,%c, %d) durch doppelte (%%a, %%b, %%c, %%d). Wenn du den geposteten Syntaxfehler bekommst, dann hast du eine Laufvariable übersehen.

@Endoro: ad "mit der Option /Format:csv soll es angeblich besser sein."

Frag mich doch mal, ob ich das vielleicht auch getestet habe. face-wink
Da ist zwar der Output ein wenig anders - nicht aber das marode CRCRCRLF.
Ebenso mit der Variante "wmic os get caption /value".
Zu allem Überfluss: das Attribut "Caption" ist auch noch in der Wmic-Hilfe undokumentiert. DrexpraktikantInnen. *g


Grüße
Biber
Mitglied: Bergur
Bergur 09.04.2013 um 10:39:27 Uhr
Goto Top
Moin,
ganz ehrlich, das is ja so ein ###... Darauf das das ein Microsoftproblem ist wär ich nie gekommen. Ich glaub ich versuch das ich auf dne neueren systemen wos geht powershell verwenden wenn das da besser funktioniert, und dann freu ich mich schon auf die linux server wo ich das alles nicht brauche xD
Nja das problem ist halt das ich erstmal rausfinden muss was das für ein system ist und dann tu das und das ausser bei der groben Trennung linux/windows.
Warscheinlich muss ich nichtmal genau wissen welches Betriebssystem, aber eben obs die Befehle die ich brauche da gibt.Jetzt im einfachen Beispiel bisher ists ja nur wmic logicaldisk, aber läuft das auch unter nt4 zb? Gibts da irgnedwo ne übersicht über so Befehle?

/value hab ich schon probiert das war auch irgendwie komisch. Dieser Bug machts nich grad einfacher das zu lernen wenn man denkt hä wieso is das jetz schonwieder falsch oder isses vll doch richtig^^