Top-Themen

Aktuelle Themen (A bis Z)

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

gelöst Set-Befehl innerhalb einer Schleife funktioniert nicht wie erwartet

Mitglied: Koyote

Koyote (Level 1) - Jetzt verbinden

11.02.2008, aktualisiert 12.02.2008, 7745 Aufrufe, 7 Kommentare

Hallo Experten,

mit folgendem Problem schlage ich mich seid Tagen herum und komme einfach nicht weiter. Und zwar möchte ich innerhalb einer Schleife eine Textdatei zeilenweise auslesen. Aus der jeweiligen Zeile soll ein bestimmter String extrahiert und über die Konsole ausgegeben werden. Die Entwicklung erfolgt auf einer Rechner mit Windows XP SP2.


Inhalt der Datei "test.txt":
3 Datei(en) 1.245.247 Bytes
1 Datei(en) 2.902.052 Bytes


Inhalt der Batchdatei:
for /f "tokens=1 delims=;" %%j in (c:\temp\test.txt) do (
set v1=%%j
set v2=%v1:*Datei(en)=%
echo %v2%
)
pause

Gewünschtes Ergebnis soll sein:
1.245.247 Bytes
2.902.052 Bytes

Jedoch erhalte ich als Ausgabe:
*Datei(en


Ich vermute, dass das Problem im Zusammenhang mit dem "set"-Befehl innerhalb der Schleife liegt, da der Befehl außerhalb einer Schleife erfolgreich ausgeführt wird.

Für einen Tip bin ich dankbar!



Zusatz:
Eine Lösung konnte ich mittlerweile finden, indem ich mit dem CALL-Befehl die Stringextraktion außerhalb der Schleife durchführe. Aber vielleicht gibt es noch eine elegantere Lösung.


Inhalt der Batchdatei:
for /f "tokens=1 delims=;" %%j in (c:\temp\test.txt) do (
set v1=%%j
call :prozedur
)
pause

:prozedur
set v2=%v1:*Datei(en)=%
echo %v2%
Mitglied: bastla
11.02.2008 um 17:20 Uhr
Hallo Koyote!

Deine gefundene Lösung ist nicht wirklich unelegant - aber Du kannst das Unterprogramm auch so vermeiden:
01.
for /f "tokens=2*" %%j in (c:\temp\test.txt) do echo %%k
Grüße
bastla
Bitte warten ..
Mitglied: miniversum
11.02.2008 um 17:32 Uhr
Ja das liegt daran das die Auflösung von Variabeln in Schleifen ncith geht. Da kan man eben entweder so wie Du machen indem man es in eine Extra Prozedur umleitet oder mit delayedexpansion arbeitet.

Eleganter wäre das ganze doch wenn ich das richtig verstehe einfach so:
for /f "tokens=2* delims= " %%j in (c:\temp\test.txt) do echo %%k
Bitte warten ..
Mitglied: bastla
11.02.2008 um 18:33 Uhr
... um vielleicht auch die Verwendung der angesprochenen "delayedexpansion" zu demonstrieren:
01.
@echo off & setlocal enabledelayedexpansion
02.
for /f "delims=" %%j in (cs:\temp\test.txt) do (
03.
	set "v1=%%j"
04.
	set "v2=!v1:*Datei(en)=!"
05.
	echo !v2!
06.
)
07.
pause
Nachteil dieser Vorgangsweise (allerdings hier vermutlich zu vernachlässigen): In den Daten enthaltene "!" gehen verloren, sind in einer Zeile sogar zwei "!", verschwindet auch der Text dazwischen.

Grüße
bastla
Bitte warten ..
Mitglied: Koyote
12.02.2008 um 14:57 Uhr
Danke für die schnellen Rückmeldungen. Diese konnten auf jeden Fall meine große Leere übers Batchen ein weinig füllen. Aber wie das nunmal beim Programmieren so ist, habe ich dieses Problem bereits abgehackt und bin dafür auf ein neues gestoßen.

Eigentlich müsste ich dafür einen neuen Thread öffnen, aber vielleicht lässt dieses sich auch hier lösen.

Und zwar geht es um Rechenoperationen mit Zahlen größer 32 Bit. Einen Lösungsansatz konnte ich dem Thread "freien Festplattenspeicher über die Kommandozeile abfragen" entnehmen. Genauer geht es um das vom Biber eingestellte Batch:


Biber 04.04.2006

::------snipp getfreespace.bat
@echo off & setlocal enabledelayedexpansion
@for %%a in (%*) do @for /f "tokens=3" %%i in ('dir /-c %%a:^|find /i "Bytes fre"') do call :calc %%a %%i
goto disp
:calc
(Set "Dim=GigaByte") & (set fs_drive%1=%1) & set fs_space=%2
set /a fs_space=%fs_space:~0,-9%+0
if %fs_space% == 0 (set /a fs_space=%2/1024) && set "Dim=KByte"
if [%Dim%]==[KByte] if %fs_space% GTR 1024 (set /a fs_space/=1024) && set "Dim=MByte"
if [%Dim%]==[GigaByte] if %fs_space% GTR 1024 (set /a fs_space/=1024) && set "Dim=TeraByte"
if [%Dim%]==[GigaByte] if %fs_space% GTR 1024 (set /a fs_space/=1024) && set "Dim=PetaByte"
set "fs_space%1=%fs_space% %dim% frei"
goto :eof

:disp
For %%i in (%*) do echo Laufwerk !fs_drive%%i!:\ !fs_space%%i!
::------snapp getfreespace.bat

Biber 04.04.2006


Soweit ich dieses richtig verstehe, wird vor der weiteren Verwendung einer Variabel als Zahl, diese zuvor mit

--- set /a fs_space=%fs_space:~0,-9%+0 --- und
--- if %fs_space% == 0 ---

geprüft. Nicht nachvollziehen kann ich, wie das Programm mit Zahlen größer 32 Bit umgeht.

Für jeden Tip bin ich dankbar!
Bitte warten ..
Mitglied: miniversum
12.02.2008 um 15:21 Uhr
In dieser Batch wird ja die Anzeige der freien Bytes vom Dir Befehl benutzt.
Das ist dann eine Zahl beliebiger Länge, z.B. 13967048704
Diese Zahl wird dann als Textstring weiter verarbeitet.
die in meinem Beispiel verwendete Zahl ist ja in der Einheit B. In GB wäre das (groß) einfach das gleiche wenn man die letzten 9 Stellen entfernt, also 13 GB.
Der Befehl
set fs_space=%fs_space:~0,-9%
Würde dies damit erledigen.

der hier Verwendete zusatz mit /a und der +0 macht zusätzlich aus dem Textstring eine Zahl die man dann auf größer und kleiner prüfen kann.
Wäre also die Zahl nach dem Abschneiden der letzten 9 Stellen = 0 würde das also Bedeuten das die zahl kleiner einem GB ist. Daher diese kontrolle mit
if %fs_space% == 0 ..

miniversum
Bitte warten ..
Mitglied: Koyote
12.02.2008 um 16:08 Uhr
Danke für die super schnelle Antwort.

D.h. also man muss diesem Fall mit Unschärfen leben.
Zum Beispiel:

75161927680 Bytes entsprechen 70 GigaByte, wobei das Batch 75 GigaByte ausgeben würde.
Bitte warten ..
Mitglied: miniversum
12.02.2008 um 16:16 Uhr
Ja.
Alternativ gibt es in dem Posting glaube ich auch ein VBS skript was das genau kann.

miniversum
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Set-Befehl funktioniert nicht
gelöst Frage von DschingisBatch & Shell7 Kommentare

Hallo zusammen, ich bin geraden dabei ein Programm zu erweitern. Dieses Programm soll das Feld "MobilePhone" im AD füllen. ...

Batch & Shell

Batchdatei: SET-Befehl funktioniert in IF ELSE nicht

Frage von Alicudi2000Batch & Shell9 Kommentare

Guten Tag In einer CMD-Batchdatei musste ich den Quellcode ändern, weil ich keine Variable im ELSE-Teil definieren konnte. Einen ...

Batch & Shell

BATCH: Minuszeichen in set-Befehl

gelöst Frage von SchottenrockBatch & Shell3 Kommentare

Guten Morgen, ich komme gerade nicht weiter und es wit wohl nur eine Kleinigkeit, aber ich steh gerade auf ...

Batch & Shell

Batch - Aufruf mit Parameter und set-Befehl

gelöst Frage von RailroadrunnerBatch & Shell4 Kommentare

Hallo, ich habe ein Problem mit einem Skript, wo ich nicht weiterkomme. Es soll eine Batch (test.bat) aufgerufen werden. ...

Neue Wissensbeiträge
iOS
WatchChat für Whatsapp
Tipp von Criemo vor 1 TagiOS

Ziemlich coole App für WhatsApp User in Verbindung mit der Apple Watch. Gibts für iOS sowohl als auch für ...

iOS
IOS hat nen Cursor !!!
Tipp von Criemo vor 1 TagiOS5 Kommentare

Nette Funktion im iOS. iPhone-Mauszeiger aktivieren „Nichts ist nerviger, als bei einem Tippfehler zu versuchen, den iOS-Cursor an die ...

Off Topic
Avengers 4: Endgame - Erster Trailer
Information von Frank vor 3 TagenOff Topic2 Kommentare

Ich weiß es ist Off Topic, aber ich freue mich auf diesen Film und vielleicht geht es anderen hier ...

Webbrowser
Microsoft bestätigt Edge mit Chromium-Kern
Information von Frank vor 3 TagenWebbrowser5 Kommentare

Microsoft hat nun in seinem Blog bestätigt, dass die nächste Edge Version kein EdgeHTML mehr für die Darstellung benutzen ...

Heiß diskutierte Inhalte
Exchange Server
Exchange Server 2010: Keine Eingehenden E-MAils
gelöst Frage von gabeBUExchange Server17 Kommentare

Hallo Zusammen Ich habe das kurzen auf dem Exchange 2010 Server das Problem, dass ich keine externen E-Mails mehr ...

Windows Netzwerk
Kerio. Kann keine Mails empfangen aber senden. Wer ist schuld. Kerio oder Windows domäne?
gelöst Frage von frosch2Windows Netzwerk17 Kommentare

Hallo, es existiert ein Problem bei uns mit dem mailen. Alle bestehenden Nutzer können mailen. Raus wie rein. Neuen ...

Hosting & Housing
VMware VM mit über 1TB RAM für S4HANA
Frage von Leo-leHosting & Housing15 Kommentare

Hallo zusammen, wer hat Erfahrng und kann mir einen Tipp zum sizing von S4HANA Systemen geben? Wir möchten, zunächst ...

Ubuntu
Eingehängte Partition ändern
Frage von Florian961988Ubuntu14 Kommentare

Hallo wir nutzen hier GITLAB(liegt in einer VMWARE ESXI mit UBUNTU 18.04), dort hat man eine Partition für Root ...