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

Vergleich von zwei Strings

Frage Entwicklung Batch & Shell

Mitglied: Bergur

Bergur (Level 1) - Jetzt verbinden

05.04.2013, aktualisiert 15:05 Uhr, 2322 Aufrufe, 11 Kommentare

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:
01.
@Echo Off  
02.
cls 
03.
SETLOCAL ENABLEDELAYEDEXPANSION 
04.
rem kp obs das braucht 
05.
TYPE NUL > c:/test1.txt  
06.
rem -------------------- 
07.
TYPE NUL > c:/name.txt  
08.
rem -------------------- mittlerweile egal 
09.
 
10.
rem ----------------------------------------------------------------------------------------------  
11.
 
12.
 
13.
 
14.
setlocal enabledelayedexpansion 
15.
for /f "Tokens=* skip=1" %%a in ('wmic os get caption^') Do ( 
16.
	echo %%a 
17.
	rem echo nur zum testen 
18.
	for /f "Tokens=*" %%b in ("Microsoft Windows 7 Professional") do ( 
19.
	echo %%b bestätigt 
20.
	rem echo nur zum testen 
21.
		if /I 	%%a EQU %%b ( 
22.
rem ----wieso geht das net? 
23.
			echo hurra es funktioniert 
24.
rem ----------------------------------------------------------------------------------------------  
25.
			wmic logicaldisk where "volumename=''" set volumename=test 
26.
			rem setz den volumename auf "test" falls dieser im vorfeld nicht schon gesetzt ist 
27.
				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 
28.
				rem fragt die daten ab und sortiert sie 
29.
			wmic logicaldisk where "volumename='test'" set volumename='' 
30.
			rem ändert die volumenamen zurück auf den leeren wert 
31.
		 
32.
33.
		else ( 
34.
		echo fuck 
35.
36.
37.
)
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]
Mitglied: Endoro
05.04.2013, aktualisiert um 16:40 Uhr
Hallo Bergur,

ich hab das mal nachgestellt:

01.
@echo off&setlocal 
02.
set a=Microsoft Windows 7 Professional 
03.
set b=Microsoft Windows 7 Professional 
04.
 
05.
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!
Bitte warten ..
Mitglied: Biber
05.04.2013, aktualisiert um 18:08 Uhr
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?
01.
D:\Biber\temp>set "a1=Microsoft Windows 7 Professional" 
02.
 
03.
D:\Biber\temp>set "a2=Microsoft Windows 7 Professional" 
04.
 
05.
D:\Biber\temp>if "%a1%"=="%a2%" echo [%a1%] und [%a2%] sind gleich 
06.
[Microsoft Windows 7 Professional] und [Microsoft Windows 7 Professional] sind gleich
Grüße
Biber
Bitte warten ..
Mitglied: Bergur
08.04.2013 um 10:57 Uhr
Das funktioniert leider alles nochnicht. Ich denke das es an dem If liegt, bzw an der ersten variable "%%a"
01.
... 
02.
for /F "Tokens=* skip=1" %%a in ('wmic os get caption') Do (  
03.
	echo %%a 
04.
	rem echo nur zum testen 
05.
	for /f "Tokens=*" %%b in ("Microsoft Windows 7 Professional") do ( 
06.
	echo %%b bestätigt 
07.
	rem echo nur zum testen funktioniert 
08.
		if 	"%%a" == "%%b" ( echo hurra es funktioniert) 
09.
...
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.
Bitte warten ..
Mitglied: Biber
08.04.2013, aktualisiert um 15:34 Uhr
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
Bitte warten ..
Mitglied: Bergur
08.04.2013 um 14:09 Uhr
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.
Bitte warten ..
Mitglied: Endoro
08.04.2013, aktualisiert um 18:04 Uhr
Hallo Bergur,

idR wird der zusätzliche "CR" mit einer weiteren Forschleife aufgefangen. Scheint aber nicht bei allen zu klappen (Windows-Versionsabhängig?):
01.
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:

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

Gruss!
Bitte warten ..
Mitglied: Biber
08.04.2013, aktualisiert um 19:07 Uhr
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
Bitte warten ..
Mitglied: Endoro
08.04.2013, aktualisiert um 19:30 Uhr
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


Gruss!
Bitte warten ..
Mitglied: Bergur
09.04.2013, aktualisiert um 08:58 Uhr
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.
Bitte warten ..
Mitglied: Biber
09.04.2013, aktualisiert um 09:20 Uhr
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.
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
Bitte warten ..
Mitglied: Bergur
09.04.2013 um 10:39 Uhr
Moin,
ganz ehrlich, das is ja so ein Scheiß... 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^^
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(1)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Netzwerke
VPN DHCP IPSec im Vergleich zu L2TP over IPSec (1)

Frage von TomJones zum Thema Netzwerke ...

Festplatten, SSD, Raid
Vergleich zweier SSD-Typen im Raid-10 für den Anwendungsfall SQL-Datenbank (8)

Frage von DerWoWusste zum Thema Festplatten, SSD, Raid ...

Notebook & Zubehör
Erster Vergleich: MacBook Pro und Surface Book

Link von runasservice zum Thema Notebook & Zubehör ...

Batch & Shell
gelöst Dateien automatisch anhand von 2 komplizierten Dateinamen-Strings verschieben (3)

Frage von cleverm 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 ...

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

Frage von Floh21 zum Thema Outlook & Mail ...

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

Frage von Haures zum Thema Windows Server ...