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

Frage Entwicklung Batch & Shell

GELÖST

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

Mitglied: alexf001

alexf001 (Level 1) - Jetzt verbinden

18.03.2007, aktualisiert 18.10.2012, 15643 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
Linux

Meltdown und Spectre: Linux Update

Information von Frank vor 10 StundenLinux1 Kommentar

Meltdown (Variante 3 des Prozessorfehlers) Der Kernel 4.14.13 mit den Page-Table-Isolation-Code (PTI) ist nun für Fedora freigegeben worden. Er ...

Tipps & Tricks

Solutio Charly Updater Fehlermeldung: Das Abgleichen der Dateien in -Pfad- mit dem Datenobject ist fehlgeschlagen

Tipp von StefanKittel vor 1 TagTipps & Tricks

Hallo, hier einmal als Tipp für alle unter Euch die mit der Zahnarztabrechnungssoftware Charly von Solutio zu tun haben. ...

Sicherheit

Meltdown und Spectre: Wir brauchen eine "Abwrackprämie", die die CPU-Hersteller bezahlen

Information von Frank vor 1 TagSicherheit12 Kommentare

Zum aktuellen Thema Meltdown und Spectre: Ich wünsche mir von den CPU-Herstellern wie Intel, AMD oder ARM eine Art ...

Sicherheit

Meltdown und Spectre: Realitätscheck

Information von Frank vor 1 TagSicherheit9 Kommentare

Die unangenehme Realität Der Prozessorfehler mit seinen Varianten Meltdown und Spectre ist seit Juni 2017 bekannt. Trotzdem sind immer ...

Heiß diskutierte Inhalte
Sicherheit
Meltdown und Spectre: Die machen uns alle was vor
Information von FrankSicherheit24 Kommentare

Aktuell sieht es in den Medien so aus, als hätten die Hersteller wie Intel, Microsoft und Co den aktuellen ...

Ubuntu
Ubuntu - Starter für nicht vertrauenswürdige Anwendungen
Frage von adm2015Ubuntu17 Kommentare

Hallo zusammen, Ich verwende derzeit die Ubuntu Versionen 17.10 bzw. im Test 18.04. Ich habe mehrere .desktop Dateien in ...

Netzwerke
Packet loss bei "InternetLeitungsvollauslastung"
gelöst Frage von Freak-On-SiliconNetzwerke17 Kommentare

Servus; Ja der Titel klingt komisch, is aber so. Wenn die Internetleitung voll ausgelastet ist, hab ich extreme packet ...

Windows 10
Automatische daten kopieren, USB zu USB unter Win10 im Hintergrund
Frage von DerEisigeWindows 1016 Kommentare

Hallo Leute, ich bin auf der Suche nach einem Skript, dass von einem USB Stick automatisch nach dem einstecken ...