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 Strings schneiden in %%i bei For-schleife [Noobi]

Mitglied: alexf001

alexf001 (Level 1) - Jetzt verbinden

18.03.2007, aktualisiert 18.10.2012, 15821 Aufrufe, 10 Kommentare

Hallo.
habe seit einiger Zeit versucht paar Kleinigkeiten in Windows-shell zu realisieren, da mich unser Prof ankotzt, der der Meinung ist Windows=Mist, Linux=Lösung für alles!

Paar Fragen:
1. Wieso kann ich in der shell bei einer For-schleife %i benutzen,
aber in einer bat-datei geht es nur mit %%i ?
2. wenn ich einfach so
set i=%i:~0,5%
eingebe funktioniert das ausschneiden, aber wenn ich
for /F %%i in ('dir /b') do echo %i:~3,5%
eintippee nicht?! ==> :~3,5% wird an den dateiname angehängt
123_datei.txt:~3,5%
asdfas_test1.bat:~3,5%
cvncv_test2.bat:~3,5%
gsdgsdh_test.bmp:~3,5%

3. dann dachte ich einfach:
for /F %%i in ('dir /b') do ^
set temp=%%i & echo %temp:~3,5%
==> ausschneiden funktioniert, aber die Variable temp hat immer den letzten wert (denselben)!
gsdh
gsdh
gsdh
gsdh

wieso ich sowas mach:
habe oft eine größere anzahl an dateien die irgendwelche "blöde" zusätze im namen haben. (z.B. Serien)
nun wollte ich die davon befreien.
für den fall dass ab einen bestimmten zeichen abgeschnitten werden soll habe ich hinbekommen,
aber bei einer bestimmten position noch nicht.

danke im voraus!
Mitglied: bastla
18.03.2007, aktualisiert 18.10.2012
Hallo alexf001 und willkommen im Forum!

Bis Biber die Details nachreicht:

zu 2.
"Einfach so" ist %i% eine "gewöhnliche" Variable, in einer "for"-Schleife ist %%i eine Laufvariable mit besonderen Eigenschaften - Lösung: Hast Du, wie 3. zeigt, schon gefunden; alternativ (für umfangreichere Bearbeitung) bietet sich noch ein
01.
for /f "delims=" %%i in ('dir /b') do call :ProcessFile "%%i"
an - damit wird ein Unterprogramm aufgerufen und %%i (zur Sicherheit innerhalb von Anführungszeichen) als Argument übergeben. Damit der Batch nicht irrtümlich in das Unterprogramm läuft, sollte dieses mit einem
01.
goto :WeiterUnten
übersprungen oder das Hauptprogramm mit einem
01.
goto :eof
abgeschlossen werden.
Im Unterprogramm (das mit der Zeile
01.
:ProcessFile
beginnt) erhältst Du den Wert von %%i mit %~1 (durch "~" wieder ohne Anführungszeichen) zur weiteren Bearbeitung - damit umgehst Du auch das Problem wie bei 3., da bis zum Rücksprung aus dem Unterprogramm die "for"-Schleife verlassen wird. Das Unterprogramm beendest Du mit einem
01.
goto :eof
zu 3.
Bei "for"-Schleifen werden Variablenwerte nur einmal ausgewertet - Lösung: DelayedExpansion einschalten
01.
setlocal enabledelayedexpansion
und beim Auslesen statt %temp% !temp! schreiben - dazu gibt's hier im Forum massenhaft Beispiele.
Schematisch ergeben sich also folgende Varianten:
01.
for /f "delims=" %%i in ('dir /b') do call :ProcessFile "%%i" 
02.
goto :eof 
03.
:ProcessFile 
04.
set "temp=%~1" 
05.
echo %temp:~3,5% 
06.
goto :eof
(konkretes Beispiel dazu erst neulich) oder
01.
setlocal enabledelayedexpansion 
02.
for /f "delims=" %%i in ('dir /b') do set "temp=%%i" & echo !temp:~3,5!
Anmerkung: Die "set"-Schreibweise mit dem Anführungszeichen vor dem Variablennamen soll sicherstellen, dass auch Variableninhalte mit Leerstellen komplett in die neue Variable übernommen werden - die Anführungszeichen selbst werden dabei nicht Inhalt der neuen Variablen.

Weitere Anmerkung: Den Variablennamen %temp% habe ich zur Bezugnahme auf Dein Beispiel belassen - an sich solltest Du einen anderen Namen wählen, da %TEMP% und %TMP% defaultmäßig als Systemvariable auf den aktuellen Temp-Pfad verweisen.
für den fall dass ab einen bestimmten zeichen abgeschnitten werden soll habe ich hinbekommen, aber bei einer bestimmten position noch nicht.
Was meinst Du mit "bestimmter Position"?

Grüße
bastla

P.S.: Ob Du mit Deinen obigen Erkenntnissen Deinen Prof widerlegen kannst ...

[Edit] "Weitere Anmerkung" hinzugefügt [/Edit]
Bitte warten ..
Mitglied: alexf001
18.03.2007 um 22:37 Uhr
meine lösung für abschneiden nach einen bestimmten zeiche:
for /F %%i in ('dir /b') do ^
for /F "delims=_ tokens=2" %%j in ("%%i") do ren %%i %%j

p.s. html-tag funktionieren hier nicht?! wie verwendest du "code-schnipsel"?
wo kann man genaueres zu umramung mit !...! nachlesen?
gibt es andere möglichkeit ohne:
setlocal enabledelayedexpansion
und
rumspriengen mit goto?

danke schonmal!!!
Bitte warten ..
Mitglied: bastla
19.03.2007 um 00:04 Uhr
Hallo alexf001!

Zur Formatierung (ganz versteckt in den FAQ ): siehe auch Link im Kommentareingabefenster ...

wo kann man genaueres zu umramung mit !...! nachlesen?
In der Hilfe zu "set"; dort findest Du auch zusätzlich noch Informationen zur Stringzerlegung (nach Deinem Beispiel oben war ich davon ausgegangen, Du hättest Dich schon näher damit beschäftigt) - dazu ergänzend ein Beispiel mit variabler Position:
01.
setlocal enabledelayedexpansion 
02.
set Pos=10 
03.
set "String=NurbisZehnundnichtweiter" 
04.
echo !String:~0,%Pos%!
Hier wird zunächst %Pos% und danach (verzögert) !String! aufgelöst.
Hinweis: Das Beispiel nicht von der Commandline, sondern als Batch ausführen.

gibt es andere möglichkeit ohne:
setlocal enabledelayedexpansion
und
rumspriengen mit goto?
AFAIK nicht in Batch - außer ev das Ersetzen von Text bei der Ausgabe von Variablen (aber nur mit konstantem Ersatz-Text, ansonsten ist auch dafür DelayedExpansion erforderlich) - Beispiele:
01.
set "String=DelayedExpansion brauchen wir nicht oft" 
02.
echo %String% 
03.
echo %String:nicht=sehr% 
04.
echo %String:nicht =%
Variabel:
01.
setlocal enabledelayedexpansion 
02.
set "Ersatz=wirklich sehr" 
03.
set "String=DelayedExpansion brauchen wir nicht oft" 
04.
echo %String% 
05.
echo !String:nicht=%Ersatz%!
Grüße
bastla
Bitte warten ..
Mitglied: 45426
19.03.2007 um 00:10 Uhr
1. Wieso kann ich in der shell bei einer For-schleife %i benutzen,
aber in einer bat-datei geht es nur mit %%i ?

Weil das seit ewigen Zeiten die Vorgaben sind. Das war schon in Uralt-Dos-Versionen eine Bedingung.

Auszug aus der Windows-Hilfe:

{%Variable|%%Variable}
... Stellt einen ersetzbaren Parameter dar. Verwenden Sie %Variable, wenn Sie den Befehl for über die Eingabeaufforderung ausführen möchten. Verwenden Sie %%Variable, wenn Sie den Befehl for in einer Batchdatei ausführen möchten. Variablen berücksichtigen Groß-/Kleinschreibung und müssen durch einen Alphawert, z. B. %A, %B oder %C, dargestellt werden.
Bitte warten ..
Mitglied: 45426
19.03.2007 um 00:11 Uhr
--einmal piepen reicht-- MfG Biber
Bitte warten ..
Mitglied: Biber
19.03.2007 um 08:01 Uhr
Moin alexf001,

Fussnote zu bastla's geduldigen Ausführungen und Deinen Fragen:
gibt es andere möglichkeit ohne:
setlocal enabledelayedexpansion
und rumspriengen mit goto?
Klar. Die von Dir scherzhaft "Windows-Shell" genannte CMD.exe kommt doch aus dem Land der unbegrenzten Möglichkeiten...

Ein Beispiel:
01.
::NoobiDemo.bat 
02.
@echo off & setlocal 
03.
set Pos=10 
04.
set "String=NurbisZehnundnichtweiter" 
05.
call echo %%String:~0,%Pos%%%
Und was die Aussage Deines Profs betrifft:
...der der Meinung ist Windows=Mist, Linux=Lösung für alles!

Das ist natürlich so nicht haltbar.
Richtig muss es heißen:
Windows=Bockmist, Unix=Lösung für alles!

Gruss
Biber
Bitte warten ..
Mitglied: alexf001
19.03.2007 um 16:06 Uhr
aslo um auf eine punkt zu kommen und nicht immer drum herum mit 1000 beispielen ;) :

zu 1): ist so! weil ist so!?
zu 2) keine antwort überhaupt????
zu 3) entweder
setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir /b') do set "temp=%%i" & echo !temp:~3,5!
oder rumspringen mit goto!

p.s.
::NoobiDemo.bat
@echo off & setlocal
set Pos=10
set "String=NurbisZehnundnichtweiter"
call echo %%String:~0,%Pos%%%
hilft mir nicht weiter, siehe frage 2!
Bitte warten ..
Mitglied: 45426
19.03.2007 um 16:23 Uhr
doppelt.
Bitte warten ..
Mitglied: 45426
19.03.2007 um 16:23 Uhr
Zu 1.) Jede Sprache, auch eine Scriptsprache verlangt eine bestimmte Syntax, die einzuhalten ist. Es ist müßig, darüber zu diskutieren, warum, wieso und weswegen das so ist. Es ist halt so.

zu 2.) Weil die Stringbearbeitung in vorgegebener Form nur für den SET-Befehl vorgesehen ist, nicht für FOR und auch nicht für ECHO, siehe 1.)

3.) siehe 2.) ;)
Bitte warten ..
Mitglied: alexf001
19.03.2007 um 16:28 Uhr
Zu 1.) Jede Sprache, auch eine Scriptsprache
verlangt eine bestimmte Syntax, die
einzuhalten ist. Es ist
müßig, darüber zu
diskutieren, warum, wieso und weswegen das so
ist. Es ist halt so.

zu 2.) Weil die Stringbearbeitung in
vorgegebener Form nur für den
SET-Befehl vorgesehen ist, nicht für
FOR und auch nicht für ECHO,
siehe 1.)

also ohne set kann ich nicht im text ausschneiden?!
schade
Bitte warten ..
Ähnliche Inhalte
Batch & Shell

Einen String in einer TXT finden, nur einen Teil als Variable setzen, FOR Schleife in FOR Schleife

gelöst Frage von KriegstreiberBatch & Shell3 Kommentare

Guten Abend alle miteinander, nunja wenn ich hier die Sufu nutze findet man etliches zu dem Thema, aber ich ...

PHP

Explode, split - String teilen und in Table mit for-schleife

gelöst Frage von ProtectedPHP4 Kommentare

Hallo, ich habe folgendes Problem: Ich würde gerne folgenden String teilen: .com Domain#8,00 Format: Produkt#Preis Hierbei ist zu beachten, ...

Batch & Shell

Batch Schleife als FOR-SCHLEIFE

gelöst Frage von mp2711Batch & Shell2 Kommentare

Mit den FOR-Schleifen habe ich mich leider bislang zu selten auseinander gesetzt, aber da ich sonst gerade nicht weiter ...

Batch & Shell

FOR Schleife mit LOOP und nachfolgender FOR Schleife

gelöst Frage von miczarBatch & Shell6 Kommentare

Hallo zusammen, ich habe ein Problem mit einem Batchfile. Situation: im Netzwerk ist kein WINS mehr vorhanden und so ...

Neue Wissensbeiträge
iOS
Updates für Iphone und Co
Information von sabines vor 2 StundeniOS

Gestern abend ist iOS 11.3.1 erschienen, ein kleineres Update, dass einige Lücken schließt und "Lahmlegen" nach einem Display Tausch ...

Windows 7

Windows 7 - Server 2008 R2: Exploit für Total Meltdown verfügbar

Information von kgborn vor 1 TagWindows 7

Kleine Information für Administratoren, die für die Updates von Windows 7 SP1 und Windows Server 2008 R2 SP1 verantwortlich ...

Sicherheit

Zero Day-Schwachstelle im Internet Explorer - wird von APT bereits ausgenutzt

Information von kgborn vor 1 TagSicherheit

Im Kernel des Internet Explorer scheint es eine Zero Day-Lücke zu geben, die von staatlichen Akteuren (APT) im Rahmen ...

Microsoft
Folder Security Viewer-Lizenzen zu gewinnen
Information von kgborn vor 1 TagMicrosoft

Ich nehme das Thema mal in Absprache mit Frank hier auf, da es für den einen oder anderen Administrator ...

Heiß diskutierte Inhalte
C und C++
Frage1 C Programmierung-Makefile Frage2 PHP-Programmierung HTTP-Fehler 404
Frage von KatalinaC und C++27 Kommentare

Hallo, ich habe 2 Fragen, die nichts miteinander zu tun haben aber mit denen ich mich gerade beschäftige: 1. ...

Linux
Linux Server oder Windows Server - lohnt eine Umstellung auf Linux und ebenso basierende SW bei einer langfristigen Planung?
Frage von motus5Linux27 Kommentare

Wir brauchen bei uns einen neuen Server. Dieser wird als Fileserver, Domäne Controller sowie Exchange Server verwendet. Wir versuchen ...

LAN, WAN, Wireless
Watchguard T15 VPN Einrichtung
gelöst Frage von thomasjayLAN, WAN, Wireless25 Kommentare

Hallo zusammen, wir möchten gerne über unsere Watchguard T15 einen VPN-Tunnel (Mobile VPN with IPSec) einrichten! Als Client nutzen ...

DSL, VDSL
ISP Wechsel auf Vodefone Koax, Gebäudeverkabelung nur per Cat 7
gelöst Frage von wusa88DSL, VDSL19 Kommentare

Hallo Zusammen, ich bin momentan bei Mnet als Glasfaser Kunde und möchte Preis/Leistungs-Technisch zu Kabel Deutschland / Vodafone wechseln. ...