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
GELÖST

Strings schneiden in %%i bei For-schleife [Noobi]

Frage Entwicklung Batch & Shell

Mitglied: alexf001

alexf001 (Level 1) - Jetzt verbinden

18.03.2007, aktualisiert 18.10.2012, 15126 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-- Mit freundlichen Grüßen 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 ..
Neuester Wissensbeitrag
Festplatten, SSD, Raid

12TB written pro SSD in 2 Jahren mit RAID5 auf Hyper-VServer

Erfahrungsbericht von Lochkartenstanzer zum Thema Festplatten, SSD, Raid ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (34)

Frage von patz223 zum Thema Windows Userverwaltung ...

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

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

Frage von Haures zum Thema Windows Server ...