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, 7720 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

Verwendung von "set" in For-Schleife funktioniert nicht

gelöst Frage von rkrausbyBatch & Shell2 Kommentare

Hallo zusammen. Ich habe ein kleines Problem beim erstellen einer Abfrage. Das Hauptproblem liegt darin dass ich innerhalb einer ...

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 ...

Entwicklung

Mit welchem Befehl kann ich in einer if schleife in Batch

gelöst Frage von JanInfoHDEntwicklung1 Kommentar

Mit welchem Befehl kann ich in einer if schleife in Batch dem Computer sagen das wenn die eingabe nicht ...

Neue Wissensbeiträge
Google Android

Googles "Android Enterprise Recommended" für Unternehmen

Information von kgborn vor 10 StundenGoogle Android3 Kommentare

Hier eine Information, die für Administratoren und Verantwortliche in Unternehmen, die für die Beschaffung und das Rollout von Android-Geräten ...

Sicherheit

Intel gibt neue Spectre V2-Microcode-Updates frei (20.02.2018)

Information von kgborn vor 11 StundenSicherheit

Intel hat zum 20. Februar 2018 weitere Microcode-Updates für OEMs freigegeben, um Systeme mit neueren Prozessoren gegen die Spectre ...

Microsoft
ARD-Doku - Das Microsoft Dilemma
Tipp von Knorkator vor 14 StundenMicrosoft3 Kommentare

Hallo zusammen, vor einigen Tagen lief in der ARD u.a. Reportage. Das Youtube Video dazu dürfte länger verfügbar sein. ...

Windows 10

Neue Sicherheitslücke in Windows 10 (Version 1709) durch Google öffentlich geworden

Information von kgborn vor 1 TagWindows 10

Vor ein paar Tagen haben Googles Sicherheitsforscher vom Projekt Zero eine Sicherheitslücke im Edge-Browser publiziert. Jetzt wurde eine weitere ...

Heiß diskutierte Inhalte
Windows Server
AD DS findet Domäne nicht, behebbar?
Frage von schapitzWindows Server40 Kommentare

Guten Tag, ich habe bei einem Kunden ein Problem mit den AD DS. Umgebung ist folgende: Windows Server 2016 ...

Router & Routing
LANCOM VPN CLIENT einrichten
Frage von Finchen961988Router & Routing27 Kommentare

Hallo, ich habe ein Problem und hoffe ihr könnt mir helfen, wir haben einen Kunden der hat einen Speedport ...

Router & Routing
ISC DHCP 2 Subnetze
gelöst Frage von janosch12Router & Routing19 Kommentare

Hallo, ich betreibe bei mir im Netzwerk einen ISC DHCP Server auf Debian, der DHCP verwaltet aktuell ein /24 ...

Switche und Hubs
Cisco SG350X-48 AdminIP in anderes VLAN
Frage von lcer00Switche und Hubs14 Kommentare

Hallo zusammen, ich habe ein Problem mir einem Cisco SG350X-48 bei der Erstinstallation wurde eine IP 192.168.0.254 (Default VLAN ...